无法通过在节点.js中切片来修改数组
Cannot modify array by slicing in node.js
>我有一个外部定义,它包装了一个缓冲区和在该缓冲区上执行操作的函数。
var Packer = {
_buffer: new Buffer(""),
readShort: function(){
var rs = this._buffer.readInt16BE();
console.log('first buffer len ' + this._buffer.length);
this._buffer = this._buffer.slice(2);
console.log('second buffer len ' + this._buffer.length);
return rs;
},
readString: function(){
var len = this.readShort();
console.log('while reading string len is ' + len);
var rs = this._buffer.toString('utf8', 2, len + 2);
this._buffer = this._buffer.slice(len + 2);
return rs;
},
};
exports.Packer = Packer;
在外部,我调用以下内容:
var HelloBob = {
handlePacket: function(p){
//.. p is a string
p = new Buffer(p);
var packer = Object.spawn(pack.Packer, {_buffer: p});
//Bob is trying to improve his knowledge
var humansOnMoon = packer.readShort();
var nameOfGalaxy = packer.readString();
},
};
问题是缓冲区在 readShort 操作后不会更新(这意味着切片会切掉缓冲区的一部分)。
first buffer len 354
second buffer len 354
while reading string len is 354
我读到切片内存后产生的缓冲区与原始缓冲区共享内存。我还尝试复制缓冲区(重叠它)以删除前 (2) 个元素,但它的行为相同。
为什么会发生这种情况,我该如何解决?
笔记:
- p 是长度为 354 的缓冲区
- 文档
我设法通过函数(而不是通过初始值设定项)设置 _buffer 变量来修复它。不知何故,如果我在 {} 中设置它,它的行为就好像它是不可变的。
var packer = Object.spawn(pack.Packer, {});
packer.setBuffer(new Buffer(p));
添加了此二传手:
setBuffer: function(nbf){
this._buffer = nbf;
}
相关文章:
- 在Safari执行javascript之前对其进行修改
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 用Javascript修改内部标记的CSS规则
- 对不同的数组进行切片并返回选定的值
- 绑定Range输入以修改样式
- 可以从Chrome扩展修改窗口对象吗
- jQuery滚动器插件修改
- 将函数从onclick修改为onload
- jQuery UI自动完成-修改问题
- Javascript日期修改
- 如何通过JQuery修改样式属性
- 使用treewalker修改表
- Angularjs:修改js中的作用域,稍后在页面中使用
- 在编译阶段后创建新的DOM树,或者继续使用原始修改的DOM
- javascript中如何进行时间切片
- 修改控制器AngularJS的全局值
- 修改数据后,setState不会触发重新渲染
- 通过sdk/system/events在修改请求观测器上测试http
- 无法通过在节点.js中切片来修改数组
- Javascript-切片需要修改Javascript