在使用for in循环时,返回的是全部可以经过对象访问的、可枚举的属性,其中既包括存在于实例中的属性,也包括存在于原型中的属性。
(1)没有在Object.prototype中添加属性数组
var obj={"name":"wjy","age":26,"sex":"female"};//定义一个object对象 var keys=[];//定义一个数组用来接受key var values=[];//定义一个数组用来接受value for(var key in obj){ keys.push(key); values.push(obj[key]);//取得value console.log(eval("obj."+key));//循环内逐一打印value值 } console.log(obj.name);//wjy console.log("keys is :"+keys+" and values is :"+values); //keys is : name,age,sex and values is : wjy,26,female
(2)在Object.prototype中添加属性
使用 for in 循环遍历对象的属性时,原型链上的全部属性都将被访问。例如咱们给Object.prototype添加一个bar属性,那么在for in 循环的时候,就会把这属性给循环出来:prototype
Object.prototype.bar = 10;// 修改Object.prototype var obj={"name":"wjy","age":26,"sex":"female"};//定义一个object对象 var keys=[];//定义一个数组用来接受key var values=[];//定义一个数组用来接受value for(var key in obj){ keys.push(key); values.push(obj[key]);//取得value } console.log("keys is :"+keys+" and values is :"+values); //keys is : name,age,sex,bar and values is : wjy,26,female,10
(3)避免原型对象扩展对循环对象时带来的干扰
推荐老是使用 hasOwnProperty 方法,这将会避免原型对象扩展带来的干扰:code
function allpro(obj){ var keys=[]; var values=[]; for(var key in obj){ //只遍历对象自身的属性,而不包含继承于原型链上的属性。 if (obj.hasOwnProperty(key) === true){ keys.push(key); values.push(obj[key]); } } console.log("keys is :"+keys+" and values is :"+values); } Object.prototype.bar = 1;// 修改Object.prototype var o={"name":"wjy","age":26,"sex":"female"};//定义一个object对象 allpro(o); //keys is : name,age,sex and values is: wjy,26,female