js對象-屬性遍歷
為了加強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對象-屬性遍歷