var obj = { name:"echolun", age:"24", sex:"male" }, objName=[], //用來裝對象屬性名 objVal=[]; //用來裝對象屬性值 for(var i in obj){ objName.push(i); objVal.push(obj[i]); } console.log(objName,objVal);
需要注意的是,for in循環對象會訪問原型鏈上所有對象屬性,看下面。
var obj = { name:"echolun", age:"24", sex:"male" }, objName=[], //用來裝對象屬性名 objVal=[]; //用來裝對象屬性值 Object.prototype.game="lastgame"; for(var i in obj){ objName.push(i); objVal.push(obj[i]); } console.log(objName,objVal); }
這里同樣是循環對象obj,但是需要注意的是,原型鏈上我們額外添加的對象game也被循環出來。
那么我們只想循環對應的對象該怎么做呢,這里引入hasOwnProperty()方法,hasOwnProperty()函數用於指示一個對象自身(不包括原型鏈)是否具有指定名稱的屬性。如果有,返回true,否則返回false。
說簡單點,它能幫你指向你當前循環的對象,而過濾掉原型鏈上其它對象,因為在工作中我們很難保證其他人是否會修改原型鏈,這樣做會更為保險,那么修改代碼。
var obj = { name:"echolun", age:"24", sex:"male" }, objName=[], //用來裝對象屬性名 objVal=[]; //用來裝對象屬性值 Object.prototype.game="lastgame"; for(var i in obj){ if(obj.hasOwnProperty(i)) { objName.push(i); objVal.push(obj[i]); } } console.log(objName,objVal); }
看吧,這下就過濾掉game了。