簡體   English   中英

有什么方法可以遍歷所有不可枚舉的屬性?

[英]Any way to traverse all the non–enumerable properties?

在編寫 JavaScript 時,我經常忘記內置對象的一些屬性,不得不在mdn 中查找它們,這很煩人,因為它減慢了我的工作。

與其引用文檔,不如創建一個對象並使用for ... in來檢查它的console.log()更方便。 但是當涉及到不可枚舉的屬性時,即使for ... in也無濟於事。

所以我的問題是,除了谷歌和文檔,還有什么方法可以檢查不可枚舉的屬性?

for(var i in Object){
    console.log([i,Object[i]]);
    // ["wtbind", function()]
}
console.log(Object.hasOwnProperty('create'));
// true
// Here Object.create is a non–enumerable property,
// and I have to look it up in documents if I forget it.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

似乎很有用,雖然它是一個相當新的補充,顯然在 Opera 中不起作用。 雖然它只列出了自己的屬性,但你總是可以爬上原型鏈。

我知道這是舊的,但你可以使用 ES6 的新特性,我認為 ES2018 是這樣的:

如果您實現可迭代對象,可以在迭代器的幫助下使用for...of (因為對象不可迭代)

假設您有以下具有一個可枚舉屬性和不可枚舉屬性的對象

const obj = Object.defineProperties({}, {
  enumerableKey: {
    enumerable: true,
    value: 'hello'
  },
  nonEnumerableKey: {
    enumerable: false,
    value: 'world'
  }
});

您可以使用Symbol.iterator使其可迭代並定義您自己的實現。 在下面的例子中,我產生了每個鍵的值(但你可以產生任何你想要的)

obj[Symbol.iterator] = function* () {
  for(const key of Object.getOwnPropertyNames(this)) {
    yield this[key]
  }
}

在此之后,您可以使用for...of循環遍歷它:

// This will log:
// 'hello'
// 'world'
for(const val of obj) {
  console.log(val);
}

或者使用傳播運算符(因為傳播通過Symbol.iterator使用迭代)

[...obj] //[ 'hello', 'world' ]

如果您想閱讀更多相關信息,我建議您閱讀以下內容:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM