【JavaScript】属性名の遍歴の方法別forin、Object.keys、OwnProperty、Reflect.ownKeys

6483 ワード

var obj = {
name:'kkk',
age:88, 
is: true,
99:100,
[Symbol()]:"symbol"
}
Object.prototype.addone = "one" //  obj            addone

Object.defineProperty(obj,"name",{
	enumerable: false }) //  obj name        
	
for (var item in obj){ console.log(item)} // 99,age,is,addone
for (var item in Object) {console.log(item)} //undefined  Object       

Object.keys(obj)
//(3) ["99", "age", "is"] addone   , symbol,name   
Object.keys(Object)
//[]

Object.getOwnPropertyNames(obj)
//(4) ["99", "name", "age", "is"]
Object.getOwnPropertyNames(Object)
//(24) ["length", "name", "prototype", "assign", "getOwnPropertyDescriptor", "getOwnPropertyDescriptors", "getOwnPropertyNames", "getOwnPropertySymbols", "is", "preventExtensions", "seal", "create", "defineProperties", "defineProperty", "freeze", "getPrototypeOf", "setPrototypeOf", "isExtensible", "isFrozen", "isSealed", "keys", "entries", "values", "fromEntries"]

Object.getOwnPropertySymbols(obj)
//[Symbol()]
Object.getOwnPropertySymbols(Object)
//[]

Reflect.ownKeys(obj)
//(5) ["99", "name", "age", "is", Symbol()]
Reflect.ownKeys(Object)
//(24) ["length", "name", "prototype", "assign", "getOwnPropertyDescriptor", "getOwnPropertyDescriptors", "getOwnPropertyNames", "getOwnPropertySymbols", "is", "preventExtensions", "seal", "create", "defineProperties", "defineProperty", "freeze", "getPrototypeOf", "setPrototypeOf", "isExtensible", "isFrozen", "isSealed", "keys", "entries", "values", "fromEntries"]
  • for in:エニュメレーション属性、プロトタイプから引き継ぐエニュメレーション属性(基本パッケージタイプのプロトタイプの属性は列挙できない)、smbolタイプは除外されますか?jsの中で基本的な包装のタイプの原型の属性は列挙することができないので、例えばObject、Aray、Numberなどか?ここの疑問は多くの人がこのように書いていますが、基本的な包装タイプはString、Boolean、Numberではないですか?エニュメレート・エニュメレート・プロパティ(Object.defineProperty()を参照)
  • Object.keys:独自に列挙可能な属性名があり、symobl
  • を除く.
  • Object.getOwn PropertyNames():自身のすべての属性は、smbol
  • を除く.
  • Object.getOwn PropertySymbors():自己所有のsmbolタイプの属性
  • Reflect.ownKeys(Obj):自身のすべての属性は、smbolを含み、列挙できないものを含み、Object.getOwnPropertyNames+Object.getOwnPropertySymbors
  • に相当する.