一 类型,值 和 变量
类型:
function classof(o){ if(o === null) return "Null"; if(o === undefined) return "Undefined"; return Object.prototype.toString.call(o).slice(8,-1); //因为有些js库会污染toString方法,所以这样调用,而不是用o.toString()}
object是否可以被add/delete property,在E3中任何对象都是可以的,在E5中可以自定义。
Object.isExtensible(o);
Object.preventExtensible(o);一旦调用此方法之后,没有方法可以再变回去。
Object.seal():同时设置extensible false,并且改对象所有property.configurable=false。注意如果property是可写的,仍然可以改变其值,只是无法删除也无法添加新的。
Object.freeze():在seal基础上同时设置所有property为read-only。
注意:上述方法都只对object本身起作用,不影响其原型链上的东西。
在https://github.com/douglascrockford/JSON-js/blob/master/json2.js 文件中定义了JSON.stringify和JSON.parse函数,这两个函数现在在E5中是内置函数了,chrome,firefox,safari等高级浏览器都提供了原生的JSON对象。
array是一个特殊的object,特殊在一下三个地方
1, 其index 是一种特殊的 object property,特殊在其值只能是32bit的整数。
2,从Array.prototype继承了一些方法
3,会自动维护一个length属性。如果设置任何一个index>=length的元素,则length=index+1;如果设置length,则删除所有index>=length的元素。
除此之外,array和object没什么区别。
所以可以理解js中的array没有out of bound错误,因为查询一个大于length-1的index时,会被当做一个普通的property来对来,自然会返回undefined而不是报错。
在js中,对象就是关联数组(或者理解为map),其本质就是key->value的无序集合。
稀疏数组 sparse array
sparse array是指index不是0开始并连续的数组,和element为undefined的数组是不同的。
var a = new Array(5); //没有元素,但是length为5,这是稀疏数组。
var a = {,,,,,}; //有5个元素,值为undefined, 这是普通数组,不同于稀疏数组。
很多数组方法对于array-like object,比如novelist都是适用的,通过Array.prototype.xxx.call(nodelist,x)的方式来调用。
所谓arra-like object,就是有index和有length属性的object,并且能用[]操作符来取值。
在E5中,string也是array-like的,不过是一个read-only array-like。