';冻结';Javascript中的数组?
由于ECMA-262规范,Javascript获得了Object.freeze()方法,该方法允许对象的属性不能更改、添加或删除';冻结';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
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