2016-05-30 48 views
-1

我得到,使用for ... in循環將返回一個對象的所有屬性,包括它的原型鏈,並使用.keys()會給我一個非繼承數組(基本上爲... in與hasOwnProperty結合),但爲什麼不在for循環中包含從Object引入的東西?也就是說爲什麼不包含..在Object中包含toString函數?謝謝!在JavaScript中,爲什麼不返回Object.prototype的內容?

+1

的了... in語句遍歷的**枚舉的屬性**的對象,以任意順序 - HTTPS://developer.mozilla。 org/en-US/docs/Web/JavaScript/Reference/Statements/for ... in – elclanrs

+1

'for..in'循環只遍歷[定義爲'enumerable']的屬性(https://developer.mozilla .ORG/EN-US /文檔/網絡/的JavaScript /參考/ Global_Objects /對象/ defineProperty)。您可以使用['Object.getOwnPropertyDescriptor(Object.prototype,'toString').enumerable']檢查該設置(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor)。 –

回答

2

對象的屬性由其鍵,值定義,也可以是可配置的,可枚舉的,可寫的。一個非枚舉屬性不會在循環中顯示。

當這樣

var myObject = {}; 
myObject["a"] = 3; 

創建一個對象的屬性,是默認配置,枚舉和可寫的。它將顯示在循環中。可以使用Object.defineProperty創建不可枚舉的屬性。您可以檢查一個屬性可以枚舉與.propertyIsEnumerable

myObject.propertyIsEnumerable("a"); // --> true 
Object.propertyIsEnumerable("toString"); // --> false 
+0

這使得完美的感覺。我沒有意識到Object的屬性被定義爲不可枚舉。謝謝! – CADBOT

相關問題