JavaScript权威指南笔记(4)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0c0315b1d5014578b6e4d7ccca03f611.html