我有一个带有TypedArray成员的对象,我想卡住该对象以防止在设置数据后对其进行修改。尝试卡住TypedArray或其ArrayBuffer的行为未达到我的预期。出于好奇,我想知道为什么它会这样运作。我正在运行4.4.4 Node 和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

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

谢谢

最佳答案

正如您所注意到的,类型化缓冲区是对原始数据的一种引用。类型化的缓冲区可以引用原始缓冲区的一个切片,几个类型化的缓冲区可以引用原始缓冲区的相同的切片。例如,使用subarray是可能的。这就是为什么卡住类型的缓冲区无法保护原始数据免受更改的原因。存储所有与原始缓冲区的切片有关的数据,这些数据被卡住并在每次更改查询期间进行检查,将是非常昂贵的。

因此,由于卡住类型缓冲区不能保证标准的数据保存,设计人员决定禁止卡住类型缓冲区。
另一种使类型化的缓冲区卡住的解决方案是,请注意,这不能保证数据保存。另一种实现方式可以使卡住类型的缓冲区成为对数据的只读接口(interface),该数据可以被另一个类型的缓冲区更改。

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

关于javascript - TypedArray和ArrayBuffers(node/chrome)上的Object.freeze()无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39141450/

10-11 17:39