在Javascript中'冻结'数组?

时间:2011-09-22 05:25:00

标签: javascript arrays object freeze

由于ECMA-262规范,Javascript获得了 Object.freeze()方法,该方法允许添加或删除其属性无法更改的对象。

var obj = {'a':1, 'b:2'};
Object.freeze(obj);
Object.isFrozen(obj);       // returns true
obj.a = 10;                 // new assignment has no affect
obj.a;                      // returns 1

到目前为止一切顺利。

我想知道,freeze()是否也适用于Arrays。

var arr = [1, 2];
Object.freeze(arr);
Object.isFrozen(arr);      // returns true
arr[0] = 10;
arr;                       // returns [10, 2] ... ouch!

也许我错了,但我的印象是,Array继承自Object。

typeof obj                 // "object"
typeof arr                 // "object"

任何想法,指示,启示都将受到高度赞赏。

3 个答案:

答案 0 :(得分:31)

是的,冻结应该适用于Arrays,您遇到的行为显然是一个实现错误。

这个错误可能与数组对象实现自定义[[DefineOwnProperty]]内部方法(使length属性有效的魔力)有关。

我刚刚对两个实现进行了测试,它运行正常(Chrome 16.0.888和Firefox Aurora 8.02a)。

关于你的第二个问题,数组对象继承自Array.prototype继承自Object.prototype,例如,您可以直接从数组对象访问Object.prototype中的非阴影方法:<​​/ p>

['a'].hasOwnProperty('0'); // true

但这与typeof的工作原理无关,此运算符将返回'object'任何对象的内容,无论其类型如何,以及null值,人们有总是抱怨。

typeof运算符的其余可能返回值对应于语言的基本类型,Number,String,Boolean,Symbol和Undefined。

答案 1 :(得分:1)

是的,它也适用于数组。

const arr = [1,2,3,4];
Object.freeze(arr);
Object.isFrozen(arr)// true
arr.push(5) // you will get a type error
arr.pop() // you will get a type error

答案 2 :(得分:0)

使用散布运算符而不是冻结,而无需修改即可复制内容(当然,如果您使用的是转译器):

const second = {
  ...first,
  test: 20
}