tag body attribute javascript enumerable

javascript - body - title html



¿Qué significa enumerable? (6)

Escribiré una definición de línea de ENUMERABLE

Enumerable: especifica si la propiedad se puede devolver en un bucle for / in.

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

Me dirigieron a MDN para ... en la página cuando decía: "para ... itera sobre las propiedades enumerables de un objeto".

Luego fui a la página de Enumerabilidad y propiedad de propiedades donde decía "Las propiedades enumerables son aquellas que pueden ser iteradas por un bucle for..in".

El diccionario define enumerable como contable, pero realmente no puedo visualizar lo que eso significa. ¿Podría darme un ejemplo de algo enumerable?


Si crea un objeto a través de myObj = {foo: ''bar''} o algo por el estilo, todas las propiedades son enumerables. Entonces, la pregunta más fácil de hacer es: ¿qué no es enumerable? Ciertos objetos tienen algunas propiedades no enumerables, por ejemplo, si llama a Object.getOwnPropertyNames([]) (que devuelve una matriz de todas las propiedades, enumerable o no, en []), devolverá [''length''] , que incluye la propiedad no enumerable de una matriz, ''longitud''.

Puede hacer sus propias propiedades no enumerables llamando a 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''

Este ejemplo toma mucho de las propiedades No enumerables en JavaScript , pero muestra un objeto que se enumera. Las propiedades pueden ser o no ser editables, configurables o enumerables. John Resig discute esto en el alcance de ECMAScript 5 Objects and Properties .

Y hay una pregunta sobre el desbordamiento de pila sobre por qué alguna vez querría hacer que las propiedades no sean enumerables .


Si tiene dificultades para visualizar "¿qué significa ser enumerable?" ¿Por qué no te preguntas a ti mismo, qué significa ser no enumerable ?

Pienso en algo como esto, existe una propiedad no encuadrable pero está parcialmente oculta ; lo que significa que no esenumerable es el extraño. Ahora puede imaginar enumerable como lo que queda: la propiedad más natural que estamos acostumbrados a encontrar desde que descubrimos los Objetos . Considerar

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

Ahora en un para ... for..in como un pseudocódigo

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

donde el cuerpo del bucle que escribió en JavaScript está en el lugar de /* whatever */


Una propiedad enumerable es aquella que se puede incluir y visitar durante bucles for..in (o una iteración similar de propiedades, como Object.keys() ).

Si una propiedad no se identifica como enumerable, el ciclo ignorará que está dentro del objeto.

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"

Una propiedad se identifica como enumerable o no por su propio atributo [[Enumerable]] . Puede ver esto como parte del descriptor de la propiedad :

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 }

Un bucle for..in luego itera a través de los nombres de propiedad del objeto.

var foo = { bar: 1, baz: 2}; for (var prop in foo) console.log(prop); // outputs ''bar'' and ''baz''

Pero solo evalúa su declaración : console.log(prop); en este caso, para aquellas propiedades cuyo atributo [[Enumerable]] sea true .

Esta condición está en su lugar porque los objetos tienen muchas más propiedades , especialmente de herencia :

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

Cada una de estas propiedades todavía existe en el objeto :

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

Pero, se omiten (o " no cuentan ") por el bucle for..in porque no son enumerables.

var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, ''constructor''); console.log(descriptor.enumerable); // false


los métodos no son enumerables; o más bien, los métodos integrados no son ... luego de buscar lo que enumerable significa script java; simplemente se refiere a un atributo de propiedad ... todos los objetos creados en ecma3 son enumerables, y ecma5 ahora puede definirlo ... eso es todo ...: D lol me llevó un poco encontrar la respuesta; pero creo que se habla en el libro de David Flanagan ... así que supongo que significa "oculto", o no "oculto", en el sentido de que los métodos no se muestran en el ciclo for in, y por lo tanto están "ocultos"


Es mucho más aburrido que algo que debería visualizarse.

Literalmente hay un atributo en todas las propiedades llamado "enumerable". Cuando se establece en falso, el método for..in saltará esa propiedad, simulará que no existe.

Hay muchas propiedades en objetos que tienen "enumerable" establecido en falso, como "valueOf" y "hasOwnProperty", porque se supone que no desea que el motor de JavaScript itere sobre esos.

Puede crear sus propias propiedades no enumerables utilizando el método 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 });

Ahora, el hecho de que hay incluso un secreto sobre el automóvil está oculto. Por supuesto, todavía pueden acceder a la propiedad directamente y obtener la respuesta:

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

Sin embargo, tendrían que saber que la propiedad existe primero, porque si intentan acceder a ella a través de for..in u Object.keys , permanecerá completamente en secreto:

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

Deberían haberlo llamado "imposible".