js對象屬性—枚舉、檢查、刪除


前言

  我們經常需要操作對象的屬性。這里記錄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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM