1. 程式人生 > 實用技巧 >for...in 與 for...of

for...in 與 for...of

Object.keys(..) 
會返回一個數組,包含所有可列舉屬性,
Object.getOwnPropertyNames(..) 會返回一個數組,包含所有屬性,無論它們是否可列舉。
propertyIsEnumerable(..) 會檢查給定的屬性名是否直接存在於物件中(而不是在原型鏈 上)並且滿足 enumerable:true。

// 讓 b 不可列舉  
Object.defineProperty(myObj,"b",{ enumerable: false, value: 3 } )
for...in 是遍歷不出b屬性的
(for..in 迴圈可以用來遍歷物件的可列舉屬性列表(包括 [[Prototype]] 鏈))
還有就是for...in遍歷無法直接獲取屬性值

ES6 增加了一種用來遍 歷數組的for...of 迴圈語法(如果物件本身定義了迭代器的話也可以遍歷物件):
var myArray = [ 1, 2, 3 ];for(let v of myArr) console.log(v);
for..of 迴圈首先會向被訪問物件請求一個迭代器物件,然後通過呼叫迭代器物件的 next() 方法來遍歷所有返回值。


但是 b in myObj 卻是true(可以通過 in 操作符來判斷是否存在)

hasOwnProperty(..) 只會檢查屬性是否在 myObj 物件中,不會檢查 [[Prototype]] 鏈。

所有的普通物件都可以通過對於 Object.prototype 的委託來訪問 hasOwnProperty(..)
但是有的物件可能沒有連線到Object.prototype(通過 Object.create(null)來建立)
這時可以使用一種更加強硬的方法來進行判斷:Object.prototype.hasOwnProperty. call(myObj,"a")