Что означает enumerable?



меня направили в MDN for..in страница когда он сказал: "for..in выполняет итерацию по перечисляемым свойствам объекта."



потом я пошел в Перечисляемость и собственность страницы свойств где он сказал " перечислимые свойства-это те, которые могут быть повторены a for..in петля."



словарь определяет enumerable как счетный, но я не могу действительно визуализировать, что это значит. Могу ли я получить пример чего-то быть перечислим?

520   6  

6 ответов:

перечислимое свойство-это свойство, которое может быть включено и посещено во время 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); в данном случае – для тех, чьи свойства и 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

если вы создаете объект через 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, но показывает перечисляемый объект. Свойства могут быть или не быть доступными для записи, конфигурируемыми или перечислимыми. Джон в отставку обсуждает это в рамках ECMAScript 5 объектов и свойств.

и, есть вопрос переполнения стека о почему вы когда-нибудь захотите сделать свойства неисчислимыми.

это намного скучнее, чем то, что должно быть визуализировано.

во всех свойствах есть буквально атрибут под названием "перечислимый."Когда он установлен в false for..in метод пропустит это свойство, притворившись, что его не существует.

есть много свойств на объектах, которые имеют "перечислимое" значение 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."

если у вас возникли трудности с визуализацией "что значит быть перечисляемым?"почему бы не спросить себя, что значит быть nonenumerable?

Я думаю об этом немного так, a nonenumerable свойства существует но частично скрытый; это означает, что nonenumerable - это странно. Теперь вы можете представить себе перечисляемое как то, что осталось - более естественное свойство, к которому мы привыкли встречаясь с тех пор, как мы обнаружили объекты. Рассмотрим

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

теперь for..in, представьте себе, как псевдокод

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

где тело цикла вы набрали в JavaScript на месте /* whatever */

Я напишу одну строку определения ENUMERABLE

перечисли: указывает, может ли свойство быть возвращено в цикле for/in.

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

методы не являются перечислимыми; или, скорее, встроенные методы не являются.. Тхо после поиска на что перечисли означает Java-скрипт; он просто ссылается на атрибут свойства.. все созданные объекты в ecma3 являются перечислимыми, и ecma5 u теперь может определить его....вот и все.. : D lol взял меня немного, чтобы найти ответ; но я считаю, что его говорили в книге Дэвида Фланагана.. поэтому я предполагаю, что это означает " скрытый "или не" скрытый " в том, что методы не отображаются в цикле for in, и, таким образом, являются "скрытый"

Comments

    Ничего не найдено.