1. ホーム
  2. javascript

[解決済み] enumerableとはどういう意味ですか?

2022-04-24 22:06:01

質問

MDNの ページ内 という文章があり、「for..in オブジェクトの列挙可能なプロパティを繰り返し処理する」とありました。

そして プロパティの列挙と所有権のページ Enumerable properties are those that can be iterated by a for.in loop."

辞書によると、enumerableはcountableと定義されていますが、その意味がよくイメージできません。何か列挙可能なものの例を教えてください。

どのように解決するのですか?

列挙可能なプロパティとは、以下の期間中に含まれたり訪問されたりすることができるものです。 for..in のループ(または同様のプロパティの繰り返し、例えば Object.keys() ).

プロパティが列挙可能であると認識されていない場合、ループはそのプロパティがオブジェクト内にあることを無視します。

var obj = { key: 'val' };

console.log('toString' in obj); // true
console.log(typeof obj.toString); // "function"

for (var key in obj)
    console.log(key); // "key"


プロパティが列挙可能かどうかは、それ自体で識別されます。 [[Enumerable]] 属性 . の一部として表示することができます。 プロパティの記述子 :

var descriptor = Object.getOwnPropertyDescriptor({ bar: 1 }, 'bar');

console.log(descriptor.enumerable); // true
console.log(descriptor.value);      // 1

console.log(descriptor);
// { value: 1, writable: true, enumerable: true, configurable: true }

A for..in ループは、オブジェクトのプロパティ名を反復します。

var foo = { bar: 1, baz: 2};

for (var prop in foo)
    console.log(prop); // outputs 'bar' and 'baz'

しかし、そのステートメントを評価するのみである console.log(prop); この場合 [[Enumerable]] 属性が true .

この条件が成立するのは、オブジェクト は、さらに多くのプロパティを持っています。 、特に 継承から :

console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]

これらの各プロパティはまだ オブジェクトに存在する :

console.log('constructor' in foo); // true
console.log('toString' in foo);    // true
// etc.

しかし、それらは for..in ループを使用します。

var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');

console.log(descriptor.enumerable); // false