前言
我們經常需要操作對象的屬性。這里記錄ES5中操作對象屬性的API和它們之間的差異。
枚舉屬性
for/in遍歷對象中的所有可枚舉屬性(包括自有屬性和繼承屬性)
var obj = {name:"小花",age:18}; var obj2 = Object.create(obj); obj2.like = "骨頭"; for(item in obj2){ // 將obj中的所有可枚舉屬性名以字符串形式分別賦值給itemtypeof item; => string console.log(obj2[item]); =>小花,骨頭,18 }
// 跳過繼承屬性和方法
for(item in obj){ // 是繼承屬性或者方法就跳過此次循環。 if(!obj.hasOwnproperty(item) || typeof obj[item] === "function"){ continue; } }
object.key():返回一個數組,這個數組由對象中可枚舉的自有屬性名稱組成。
var data = { balabala1:"x", balabala2:"y", balabala3:"z", } Object.keys(data).map(function(item){ // item:自有屬性名稱 obj[item]:屬性值
console.log(data[item]); })
Object.getOwnpropertyNames():返回包含所有自有屬性名稱的列表,包括不可枚舉的。
檢測屬性
in運算符:左側是字符串形式的屬性名稱,右側是對象。如果對象或者對象的繼承屬性中有這個屬性就返回true。
var obj = {name:"小花"};
console.log("name" in obj );
Object.hasOwnProperty():接收一個字符串形式的屬性名,檢測是否是對象的自有屬性,繼承屬性會返回false
propertyIsEnumerable():hasOwnProperty的增強版本,只有當這個屬性是自有屬性並且可枚舉的時候才會返回true
刪除屬性
delete可以刪除對象的屬性。他的操作數應該是一個屬性訪問表達式。
delete 語句返回值類型是Boolean。
// 返回true的情況
o = {x:1}; // o有一個自有屬性x 並繼承了toString屬性
delete o.x; // 刪除x返回true
delete o.x; // 此時o中已經沒有x屬性了,o.x=》undefined。等同 delete undefined;
delete o.toString; // 刪除不了原型中繼承來的屬性。同樣返回true // 返回false
delete Object.prototype; // 屬性不可配置,不能刪除
var i = 0; // 聲明一個全局變量
delete i; this.i; // 無法刪除全局變量的屬性
function f(){}; // 聲明一個全局函數
delete f; this.f // 也無法刪除全局函數
delete的行為有些怪異,有幾點需要注意:
1,它只是斷開屬性和對象的聯系,不會取操作屬性中的屬性。
2,只能刪除自有屬性。
3,無法刪除不可配置的屬性。
4,無法刪除原型屬性。
5,就算其后的屬性訪問表達式的值是undefined 它返回的也是true。