';冻结';Javascript中的数组?

';冻结';Javascript中的数组?,javascript,arrays,object,freeze,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; // retu

由于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()是否也适用于数组

var arr = [1, 2];
Object.freeze(arr);
Object.isFrozen(arr);      // returns true
arr[0] = 10;
arr;                       // returns [10, 2] ... ouch!
也许我错了,但我的印象是,数组继承自Object

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

如果您有任何想法、建议和启示,我们将不胜感激。

是的,冻结应该适用于数组,您所经历的行为显然是一个实现错误

这个bug可能与数组对象实现了一个自定义的内部方法(使
length
属性工作的魔力)有关

我刚刚在两个实现上测试了它,它工作正常(Chrome16.0.888和FirefoxAurora 8.02a)

关于第二个问题,数组对象继承自
array.prototype
,它继承自
Object.prototype
,例如,您可以从
对象访问非阴影方法。prototype
直接在数组对象上:

['a'].hasOwnProperty('0'); // true
但这与
类型的
如何工作无关,对于任何对象的输入,无论其类型如何,该操作符都将返回
'object'
,并返回人们一直抱怨的
null


typeof
运算符的其余可能返回值对应于语言的基本类型、数字、字符串、布尔值、符号和未定义值。

不要使用冻结,而是使用扩展运算符在不修改内容的情况下复制内容(当然,如果您使用的是transpiler):


是的,它也适用于阵列

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

我希望它也能冻结阵列。哪些浏览器展示了上述行为?在FF6中不起作用:
var a=[];冻结(a);a、 推('foo');//TypeError:a.push(“foo”)不可扩展
它看起来像是一个实现错误。”“冻结阵列”在Firefox(6.0.2)、Chrome(14.0.835.186)中可以使用,但在以前的版本中不能使用。它不适用于Safari(5.1)。@trembl:它不适用于在新标准推出之前创建的浏览器。@salman-a这就是为什么它很有趣,它不适用于Safari 5.1(发布日期:2011年7月20日),也不适用于最新的Webkit nightly(版本5.1(6534.50,r95673))。我只是好奇为什么同样构建在Webkit上的Chrome不会受到这种影响。。。可能是因为V8 Javascript引擎?
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