1. 程式人生 > >js對象-屬性遍歷

js對象-屬性遍歷

原型鏈 未定義 對象初始化 自身 一個 color 題目 pos _proto_

為了加強js對象的認知,又刷了一題。

直接上題目:

找出對象 obj 不在原型鏈上的屬性(註意這題測試例子的冒號後面也有一個空格~)
1、返回數組,格式為 key: value
2、結果數組不要求順序

示例:

//輸入
var C = function() {this.foo = ‘bar‘; this.baz = ‘bim‘;}; 

C.prototype.bop = ‘bip‘; 

iterate(new C());


//輸出

["foo: bar", "baz: bim"]

//函數體
function iterate(obj) {
  //內容
}

解題思路,iterate接收的函數obj,先打印出來。

{foo: "bar", baz: "bim"}

輸出數組,很簡單。

for in 循環,修改iterate函數

function iterate (obj){
  for(var key in obj){
       //這裏用中括號是因為,key 是一個帶引號的字符  
       return key + ":" + obj[key]          
    }  
}

//返回

foo:bar
baz:bim
bop:bip

怎麽多一個,但是我打印obj的時候,只有兩個啊。

看了下for in ,只遍歷一個對象的可枚舉屬性。

可枚舉屬性是啥?

可枚舉屬性是指那些內部 “可枚舉” 標誌設置為 true 的屬性,對於通過直接的賦值和屬性初始化的屬性,該標識值默認為即為 true。可枚舉的屬性可以通過 for...in 循環進行遍歷(除非該屬性名是一個 Symbol)。屬性的所有權是通過判斷該屬性是否直接屬於某個對象決定的,而不是通過原型鏈繼承的。一個對象的所有的屬性可以一次性的獲取到。有一些內置的方法可以用於判斷、叠代/枚舉以及獲取對象的一個或一組屬性,下表對這些方法進行了列舉。對於部分不可用的類別,下方的示例代碼對獲取方法進行了演示。

相關鏈接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Enumerability_and_ownership_of_properties

技術分享圖片

個人理解:for in 循環是可枚舉屬性,其實就是對象初始化的值,和後來通過直接給值 xx.proprototype.one = ‘11‘這種方式,如果要訪問

console.log(obj.__proto__)

//返回

{bop: "bip", constructor: ?}

判斷不可枚舉的屬性

in: 返回布爾值,有返回 true

if(!key in bop){
  //push 進數組  
}

propertyIsEnumerable():返回布爾值,有返回 true

if(!obj[key].propertyIsEnumerable(‘bip‘)){
  //接著執行  
}

hasOwnProperty() 方法會返回一個布爾值,指示對象自身屬性中是否具有指定的屬性

if(!key.hasOwnProperty(‘bip‘)){
  //繼續執行  
}

Object.getOwnPropertyNames()方法返回一個由指定對象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol值作為名稱的屬性)組成的數組。

return Object.getOwnPropertyNames(obj).map(function (key){
   //因為後面添加屬性只會從後面添加 
    return key + ":" + obj[key]

})

Object.getOwnPropertyNames() 返回一個數組,該數組對元素是 obj自身擁有的枚舉或不可枚舉屬性名稱字符串。 數組中枚舉屬性的順序與通過 for...in 循環(或 Object.keys)叠代該對象屬性時一致。數組中不可枚舉屬性的順序未定義。

return Object.getOwnPropertyNames(obj).map(function (key){
   //因為後面添加屬性只會從後面添加 
    return key + ":" + obj[key]

})

這些是官方推薦的方法,具體的用法可以看上面的鏈接。

都可以實現上面的題目,可能會有一些兼容的問題,導致提交出錯。

這裏面 使用 hasOwnProperty 和 getOwnPropertyNames 都可以提交,不知道測試的內容到底是啥,Object.keys(obj),用他來循環push進去,因為返回的數組是三個,而value值是4個,第四個就是後面加上去的,所以這種方式也是可以的,這裏推薦比較好的方法。

getOwnPropertyNames

return Object.getOwnPropertyNames(obj).map(function (key) {
        return key + ‘: ‘ + obj[key];
    });

一道小小的題目,對於對象的基礎知識算是一個考驗。

js對象-屬性遍歷