JavaScript对象的属性有两种,一种是直接在对象上定义的属性:
prop2 = 456
prop1 和 prop2都是直接定义在a上的属性。这种关系可以通过hasOwnProperty方法来检查:
a.hasOwnProperty(“prop2”) === true
比如上面的对象a,它自己并没有定义hasOwnProperty方法,而是从Object.prototype继承过来的。如何判断一个属性是继承过来的?
“propX” in a && !a.hasOwnProperty(“propX”)
上面用到了in操作符,它用来判断对象是否具有某个属性(不管是继承过来的,还是自己定义的)。因此:
“hasOwnProperty” in a === true
for...in 语句用于遍历对象的属性:
"a" : 1,
"b" : 2
};
for (var p in obj) {
document.writeln("key:" + p + ", value:" + obj[p]);
}
// key:a, value:1
// key:b, value:2
obj.propertyIsEnumerable("hasOwnProperty") === false
“propertyIsEnumerable”方法,字面理解,就是用于判断属性是否可以遍历的。一般来说,直接定义的属性是可以遍历的,ECMA 5 版的Javascript中可以配置属性是否可以遍历。
获取一个对象的属性,有两种方法: . 和 []。 “.”后面必须跟一个JavaScript的标识符,因此,假如对象a有一个属性 “total money”,用 “.”操作符就没办法取出来:
“total money”:123
}
a.total money //报错
a.”total money”//报错
[]操作符可以接受字符串,或者任何可以转化为字符串到原始值,甚至对象:
var a = {
"123": "number",
"true" : "boolean",
"null": 'object null',
"undefined":"undefined"
}
document.writeln(a[123]);
document.writeln(a[true]);
document.writeln(a[null]);
document.writeln(a[undefined]);
var b = {
"b":"789",
"toString":function(){
return "123";
}
};
document.write( a[b] );
//输出
// number
// boolean
// object null
// undefined
// number
上面代码中的b对象,定义了toString方法,在b作为[]操作对象时自动调用,转化成字符串。
因为JavaScript中的对象是关联数组,即用字符串标记到属性的集合。类似于Java中到Map,只不过,键只能是字符串。(Javascript对象还可以从prototype中继承属性,本文不描述)
Javascript中的数组,其索引看起来是整型的,其实内部实现也是字符串:
document.writeln( a[0] );//beijing
document.writeln( a["0"] );//beijing
document.writeln( a.hasOwnProperty("0") );//true
javasciprt数组中,相邻元素在内存中到位置并不是相连的。这和C/C++,Java等语言中的数组是不一样的。性能当然也会有差别。
上面的代码中,用到了 document.writeln,为了获得更好的显示效果,代码是这样写的:
<pre>
<script type="text/javascript">
...
</script>
</pre>
上述方法仅用于调试。