【问题标题】:Object.freeze() on TypedArray and ArrayBuffers (node / chrome) not working as expectedTypedArray 和 ArrayBuffers (node / chrome) 上的 Object.freeze() 未按预期工作
【发布时间】:2017-01-01 15:50:03
【问题描述】:

我有一个带有 TypedArray 成员的对象,我想冻结它以防止在设置数据后对其进行修改。尝试冻结 TypedArray 或它的 ArrayBuffer 并没有像我预期的那样运行。出于好奇,我想知道它为什么会这样。我正在运行 node 4.4.4 和 Chrome,它的行为或多或少是相同的。

var typedArray = new Uint32Array(4);
typedArray[0] = 10;
typedArray[1] = 20;

Object.freeze(typedArray); 
// throws TypeError : Cannot freeze array buffer views with elements(...)

我尝试的下一件事是冻结底层 ArrayBuffer

Object.freeze(typedArray.buffer); // Does not throws errors
Object.isFrozen(typedArray.buffer); // returns true

typedArray[0] = 50; // Successfully modifies the data, despite the buffer is frozen

我知道我可以更改我的设计以不保留原始缓冲区,并在需要时从数据成员中重建它。但我只是对这种行为感到好奇。

谢谢

【问题讨论】:

    标签: javascript node.js google-chrome typed-arrays


    【解决方案1】:

    如您所见,类型化缓冲区是对原始数据的一种引用。类型化缓冲区可以引用原始缓冲区的一部分,并且多个类型化缓冲区可以引用原始缓冲区的同一片。这是可能的,例如subarray。这就是冻结类型缓冲区无法保护原始数据不被更改的原因。存储有关被冻结的原始缓冲区切片的所有数据并在每次更改查询期间进行检查会很昂贵。

    因此,由于冻结类型化缓冲区并不能保证数据保存标准的设计者决定禁止冻结类型化缓冲区。 另一种让类型化缓冲区冻结的解决方案,并注意它不保证数据保存。替代实现可以使冻结类型缓冲区成为数据的只读接口,可以由另一个类型缓冲区更改。

    标准的设计者只是选择了最简单的方式来实现Object.freeze 例程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 2017-02-13
      • 2018-08-15
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多