Javascript中的"in" “for...in” 及对象/关联数组

来源:互联网 发布:可以撕衣服的软件 编辑:程序博客网 时间:2024/06/06 06:29

JavaScript对象的属性有两种,一种是直接在对象上定义的属性:


var a = {“prop1”:123}

prop2 = 456


prop1 和 prop2都是直接定义在a上的属性。这种关系可以通过hasOwnProperty方法来检查:


hasOwnProperty(“prop1”) === true

a.hasOwnProperty(“prop2”) === true


这种类型到属性叫自身属性(Own Property)。另外一种属性是继承属性(Inherited Property)。
比如上面的对象a,它自己并没有定义hasOwnProperty方法,而是从Object.prototype继承过来的。如何判断一个属性是继承过来的?
“propX” in a && !a.hasOwnProperty(“propX”)

上面用到了in操作符,它用来判断对象是否具有某个属性(不管是继承过来的,还是自己定义的)。因此:


“prop1” in a  ===  true
“hasOwnProperty” in a === true



for...in 语句用于遍历对象的属性:


var obj = {
  "a" : 1,
  "b" : 2
};
for (var p in obj) {
   document.writeln("key:" + p + ", value:" + obj[p]);
}

// key:a, value:1

// key:b, value:2


上文提到的”hasOwnProperty”属性没有打印出来,因为它是不可遍历的:


obj.propertyIsEnumerable("hasOwnProperty") === false


“propertyIsEnumerable”方法,字面理解,就是用于判断属性是否可以遍历的。一般来说,直接定义的属性是可以遍历的,ECMA 5 版的Javascript中可以配置属性是否可以遍历。


获取一个对象的属性,有两种方法:  . 和 []。 “.”后面必须跟一个JavaScript的标识符,因此,假如对象a有一个属性 “total money”,用 “.”操作符就没办法取出来:


var a={
   “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中的数组,其索引看起来是整型的,其实内部实现也是字符串:


var a = ["beijing","shanghai"];
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>
上述方法仅用于调试。



原创粉丝点击