gpt4 book ai didi

javascript - TypedArray 和 ArrayBuffers(node/chrome)上的 Object.freeze() 未按预期工作

转载 作者:数据小太阳 更新时间:2023-10-29 04:49:09 25 4
gpt4 key购买 nike

我有一个带有 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

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

谢谢

最佳答案

如您所见,类型化缓冲区是对原始数据的一种引用。类型化缓冲区可以引用原始缓冲区的一片,多个类型化缓冲区可以引用原始缓冲区的同一片。这是可能的,例如 subarray .这就是为什么卡住类型缓冲区无法保护原始数据不被更改的原因。存储有关原始缓冲区切片的所有数据(已卡住)并在每次更改查询期间进行检查的成本太高。

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com