web-dev-qa-db-ja.com

enumerableはどういう意味ですか?

「for..inがオブジェクトの列挙可能なプロパティを反復処理する」と言ったとき、MDNの for..in page に導かれました。

次に、 プロパティの列挙性と所有権 に行きました。「列挙可能なプロパティは、for..inループで反復できるプロパティです」

辞書では、enumableをcountableとして定義していますが、それが何を意味するのかを実際に視覚化することはできません。列挙可能なものの例を入手できますか?

133
Patrick

列挙可能なプロパティは、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 }

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

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

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

ただし、[[Enumerable]]属性がtrueであるプロパティのステートメント(この場合はconsole.log(prop);)のみを評価します。

オブジェクト より多くのプロパティを持っている 、特に 継承から

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
131

myObj = {foo: 'bar'}またはその付近でオブジェクトを作成する場合、すべてのプロパティは列挙可能です。簡単な質問は、列挙できないものですか?特定のオブジェクトには、列挙不可能なプロパティがいくつかあります。たとえば、Object.getOwnPropertyNames([])([]で列挙可能かどうかにかかわらず、すべてのプロパティの配列を返す)を呼び出すと、['length'] -配列の列挙可能なプロパティ、 'length'。

Object.definePropertyを呼び出すことで、列挙不可能な独自のプロパティを作成できます。

var person = { age: 18 };
Object.defineProperty(person, 'name', { value: 'Joshua', enumerable: false });

person.name; // 'Joshua'
for (prop in person) {
  console.log(prop);
}; // 'age'

この例は、 JavaScriptの非列挙型プロパティ から大きく借用していますが、列挙されているオブジェクトを示しています。プロパティは、書き込み可能、​​構成可能、または列挙可能のいずれでもかまいません。 John Resigは、これを ECMAScript 5オブジェクトとプロパティ の範囲で説明しています。

そして、 なぜプロパティを列挙不可能にしたいのか に関するスタックオーバーフローの質問があります。

44
carpeliam

視覚化されるべきものよりも退屈です

文字通り、すべてのプロパティに「列挙可能」と呼ばれる属性があります。 falseに設定すると、for..inメソッドはそのプロパティをスキップし、存在しないふりをします。

「enumerable」がfalseに設定されているオブジェクトには、「valueOf」や「hasOwnProperty」など、多くのプロパティがあります。これは、JavaScriptエンジンがそれらを繰り返し処理することを望まないためです。

Object.definePropertyメソッドを使用して、列挙不可能な独自のプロパティを作成できます。

  var car = {
    make: 'Honda',
    model: 'Civic',
    year: '2008',
    condition: 'bad',
    mileage: 36000
  };

  Object.defineProperty(car, 'mySecretAboutTheCar', {
    value: 'cat pee in back seat',
    enumerable: false
  });

今、車についての秘密さえあるという事実は隠されています。もちろん、彼らはまだプロパティに直接アクセスして答えを得ることができます:

console.log(car.mySecretAboutTheCar); // prints 'cat pee in back seat'

ただし、for..inまたはObject.keysを介してアクセスしようとすると、完全に秘密のままになるため、プロパティが最初に存在することを知る必要があります。

console.log(Object.keys(car)); //prints ['make', 'model', 'year', 'condition', 'mileage']

彼らはそれを「forInAble」と呼ぶべきでした。

33
Gabriel Kunkel

「列挙可能とはどういう意味ですか」を視覚化できない場合なぜ自問しないで、nonenumerableとはどういう意味ですか?

nonenumerableプロパティexistsですが、部分的には- 非表示;つまり、nonenumerableは奇妙なものです。残されたものとして列挙可能なものを想像できます-Objectsを発見してから遭遇するより自然なプロパティです。検討する

var o = {};
o['foo'] =  0;                               // enumerable, normal
Object.defineProperty(o, 'bar', {value: 1}); // nonenumerable, weird

for..inで、pseudocodeのように想像してください

for property in o:
    if not property enumerable continue // skip non-enumerable, "bar"
    else do /* whatever */              // act upon enumerable, "foo"

入力したループの本文JavaScript/* whatever */の場所にあります

9
Paul S.

ENUMERABLEの1行の定義を記述します

Enumerable for/inループでプロパティを返すことができるかどうかを指定します。

var obj = {};
Object.defineProperties(data, {
    set1: {enumerable: true},
    set2: {enumerable: false},
});
Object.keys(obj); // ["set1"]
Object.getOwnPropertyNames(obj); // ["set1", "set2"]
8
Ved

メソッドは列挙できません。むしろ組み込みのメソッドはそうではありません。enumerableがJavaスクリプトを意味するものを検索した後のtho;プロパティ属性を参照するだけです。ecma3で作成されたすべてのオブジェクトは列挙可能であり、ecma5 uはそれを定義できるようになりました。..それだけです。:D lol少し答えを見つけました。しかし、私はそれがデビッド・フラナガンの本で語られたと信じています..そのため、メソッドはfor inループに表示されないため、「非表示」または「非表示」を意味するので、「非表示」です

0
user316264