重点在于“无序”,字符串
对象属性的key必须是字符串(不是字符串,就会转化成字符串)
不管是用字符串1,还是数字1,访问的都是同一个属性。这里1是键值。数字1转化成字符串1,所以两次赋值,访问的是同一个。
相同的,不管是不是空对象,对象作为key,也会被转化成字符串,{}被转化成字符串。所以{},{x:1} 都转化成了相同的字符串,两次都指向同一个属性。
对象的结构。
for in 读取原型属性的时候,有可能会把原型中属性也给读了,注意一下。
有的属性不可以删除的。看一下prototype的configurable其实为false。
var定义的全局变量或者局部变量,不能被删除的。左边上全局,下局部。
函数声明也是这样的,不管事全局还是局部,都不能删除函数。
有一个坑,eval()定义的函数,里面的变量是可以被删除掉的。
in查找是不是有该属性, 但是会查找到原型上。
查看属性是否可枚举,用propertyIsEnumerable方法。
所以我们输出一个对象的时候,都是这个对象自己的属性,因为原型链上的属性大多都是不可枚举的。不会显示出来。
自定义枚举的属性,使用defineProperty方法。其实如果不写enumerable,默认也是false的。但是注意,如果是用new ,字面量,object.create 创建的属性,默认其实都是true的。
网友评论