无法通过在节点.js中切片来修改数组

Cannot modify array by slicing in node.js

本文关键字:切片 修改 数组 js 节点      更新时间:2023-09-26

>我有一个外部定义,它包装了一个缓冲区和在该缓冲区上执行操作的函数。

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;
}