Что означает enumerable?
меня направили в MDN for..in страница когда он сказал: "for..in выполняет итерацию по перечисляемым свойствам объекта."
потом я пошел в Перечисляемость и собственность страницы свойств где он сказал " перечислимые свойства-это те, которые могут быть повторены a for..in петля."
словарь определяет enumerable как счетный, но я не могу действительно визуализировать, что это значит. Могу ли я получить пример чего-то быть перечислим?
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