当前位置: 代码迷 >> Web前端 >> for/in话语及in运算符的使用
  详细解决方案

for/in话语及in运算符的使用

热度:123   发布时间:2013-02-05 10:40:57.0
for/in语句及in运算符的使用

???这篇博文时关于学习javascript中我一直很少使用的一个知识点,in运算符和for/in循环语句。这两个知识点都是和对象有关系,当然这个对象也包括数组。于是,参考了网上的部分资料,总结了使用过程中的一些技巧。

1. in运算符:要求其左边的运算数是一个字符串,或可以被转换为字符串(比如number等),右边的运算数是一个对象或数组。如果该运算符左边的值是右边对象的一个属性名,则返回true。

例如:


? ? ? ? ?var person={"name":"xxx","age":25,"sex":"men"}; //对象

?

var has_name="name" in person; //返回true
      var has_girlfriend="girlfriend" in person; //返回false
      var ts="toString" in person;//返回true,toString为自定义对象的继承方法
?


???2. for/in语句:语法,for (variable in object)
????????????????????????????statement;
??????提供了一种遍历对象属性的方法。

例:for(var prop in my_object) {
????????document.write("name:"+prop+";value:"+my_object[prop],"<br>");
????}
??????javascript的数组是一种特殊的对象,因此for/in循环可以像枚举对象属性一样枚举数组下标。
可以把一个对象的所有属性名复制到一个数组中,
例:var o= {x:1,y:2,z:3};
????var a=new Array();
????var i=0;
????for (a[i++] in o)?
????;//空语句,用于初始化数组

????3. in运算符与for/in语句不同,for/in语句in的左边可以是声明一个变量的var语句,数组的一个元素或者是对象的一个属性,不能使字符串。

????4. 数组常用的存取属性运算符是“[]”,而不是“.”。使用“[]”来命名属性名师字符串值,是动态的,可以在运行时改变,而不是一个标识符“.”。

例:var stock_name= get_stock_name_from_user();//从用户处获取股票名
????var share= get_number_of_shares();//得到股票数量
????portfolio[stock_name]= share;//动态地创建数组股票,并为每支股票赋值
????将该例子与for/in循环一起使用,当用户输入了他的投资组合,可以计算当前总值
????var value= 0;
????for (stock in portfolio) {
???????value +=get_share_value(stock)*portfolio[stock];
????}
stock存取的是每支股票的名字。 ?????
portfolio[stock]存取的是每支股票的数量。

?

5.for/in的一个陷阱:

?

var Status = function(arg){
    this.arg = arg;
	}
	Status.prototype.getStatus = function(){
    return this.arg;
	}
	
	var instance = new Status('a test string');
	var value=instance.getStatus();
	//alert(value);
	instance.ooxx = 'ooxx';

	for(i in instance){
   
         document.write(i+"<br/>");
        }
?会输出结果:

?

arg
ooxx
getStatus

?

?

但这并不是我们想要的结果:我们通常只需要获得属性,而不需要获得对象的原型。解决办法如下

for(i in instance){

? ? if(instance.hasOwnProperty(i)){

? ? ? ? ?document.write(i+"<br/>");

}

}

也就是说遍历的时候使用hasOwbnProperty(property)来判断是否是属性,而过滤掉对象的函数和原型?

  相关解决方案