6、如果数据属性是不可配置且不可写的,则不能修改它的值。然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可写的)。
见136页下
检测对象是否是另一个对象的原型:
var p={x:1}
var o = Object.creat(p);
p.isPrototypeOf(o); //true
Object.prototype.isPrototypeOf(o) //true
isPrototypeOf()和instanceof运算符非常类似
-----------------------------------------------16.10.16 结束---------------------------------------------------------------------------
-----------------------------------------------16.10.20 开始---------------------------------------------------------------------------
对象的可扩展性:
ES5中所有内置对象和自定义对象都是显式可扩展的,除非将他们转换为不可扩展的。宿主对象的可扩展性是由JS引擎定义的。
Object.esExtensible(o) //判断o对象是否是可扩展的
Object.preventExtensions(o) //将o对象转换为不可扩展的,注意,如果转换为不可扩展的,则无法再将其转换为可扩展的。
同时,preventExtensions只会影响到对象本身的可扩展性。如果给一个不可扩展的对象的原型添加属性,这个对象同样会继承这些属性。
Object.seal(o) //封锁,将对象设置为不可扩展的,并且将对象所有的自有属性设置为不可配置的。即无法添加,删除或配置。如果是已有的可写属性,则依然可以设置。
Object.isSealed(o) //判断是否封锁对象
Object.freeze(o) //冻结,seal的升级版,会将所有数据属性设置为只读,存取器属性不受限制。
Object.isFreeze(o) //判断是否冻结对象
见140页6.8.3
序列化对象:
JSON.parse() //将字符串转换为JSON对象()
JSON.stringify() //将JSON对象转换为字符串(只能序列化对象可枚举的自有属性)
见141页6.9
6.10对象方法以后看
数组:
数组是一个特殊化的对象。当使用非整数或负数的作为下标的时候,则自动添加下标为属性名,当添加的下标为非负整数时,则自动维护其length属性
var a=[];
a[-1.23] = true; //创建一个名为'-1.23'的属性
a["100"] = 0; //这是数组的第101个属性,同时数组的length变为101
a[1.000] = 0 //和a[1]相等
见146页下
稀疏数组:
按书中的说法,当采用new方法时才会产生稀疏数组,采用直接量的时候就不会,比如:
var a1 = [,,,];
var a2 = new Array(5);
0 in a1 //true
0 in a2 //false
但是实际操作中,两个都是显示的false
然后在下面的操作中又说了:
var a1=[,];
var a2 = [undefined];
0 in a1 //false
0 in a2 //true
见147页下
如果将数组length设置为比数组真实长度小时,数组会删除超出部分的元素。比如:
var a = [1,2,3,4,5];
a.length = 3; //a=[1,2,3]
因此,如果让一个数组元素不能配置,那么就不能删除它,所以length的值就不能小于这个元素的索引值+1,如果小于,不会报错,但是不会发生改变。
见148页下
a.push(“123”) === a[a.length] = “123”
用delete删除数组中的元素,不会影响数组的length
见149页7.5