列挙とは、オブジェクト内のプロパティをトラバースできるかどうか、簡単に言えば、プロパティを一覧表示できるかどうかを指します。
1.列挙可能なプロパティの影響かどうか
for ... inは、独自の列挙可能なプロパティをトラバースします。プロトタイプから継承された
Object.keys Object.keysは、独自の列挙可能なプロパティをトラバースします。JSON.stringifyは、独自の列挙可能なプロパティを
文字列化します。
function Person() {
this.name = "小明"
};
Person.prototype = {
hobby: "打球",
};
var person = new Person();
Object.defineProperty(person, "age", {
value: 18,
enumerable: false
});
// for...in,遍历自身的和原型上继承的可枚举属性
for(var keys in person){
console.log(keys); // name,hobby
}
// Object.keys,遍历自身可枚举属性
console.log(Object.keys(person)); //["name"]
// JSON.stringify,字符串自身可枚举属性
console.log(JSON.stringify(person)); //{"name":"小明"}
console.log(Object.assign({
},person)); //{name: "小明"}
2.列挙可能かどうかの判断方法
各オブジェクトにはpropertyIsEnumerable()メソッドがあり、このメソッドは、指定されたプロパティが列挙可能かどうかを判別できます。
使用法:obj.propertyIsEnumerable( "property name");
console.log(person.propertyIsEnumerable('name')); //true
console.log(person.propertyIsEnumerable('age'));//false
console.log(person.propertyIsEnumerable('hobby'));//false
3.まとめ
for ... inループは、プロトタイプチェーンの列挙可能なプロパティを含む、オブジェクトのすべての列挙可能なプロパティをトラバースします
。Object.keys()は、プロトタイプチェーンのプロパティの列挙可能なプロパティではなく、独自の列挙可能なプロパティのみをトラバースします。 for ... inとObject.keys();の主な違い
Object.getOwnPropertyNames()は、プロトタイプチェーン上のプロパティを除いて、それ自体のすべてのプロパティ(列挙可能かどうかに関係なく)をトラバースします。