una saber propiedades propiedad objetos objeto metodos literales imprimir existe dinamico diccionario crear javascript object properties undefined

propiedades - saber si existe una propiedad javascript



JavaScript: identifique si una propiedad está definida y configurada como ''indefinida'' o indefinida (7)

Digamos que tengo el siguiente código:

function One() {} One.prototype.x = undefined; function Two() {} var o = new One(); var t = new Two();

ox y tx se evaluarán como undefined . o.hasOwnProperty(''x'') y t.hasOwnProperty(''x'') devolverán false; lo mismo ocurre con propertyIsEnumerable . Dos preguntas:

  • ¿Hay alguna manera de decir que buey está definido y definido como undefined ?
  • ¿Hay alguna razón para hacerlo? (¿Deberían los dos ser semánticamente equivalentes?)

Una pequeña advertencia: doing (para propName en o) loop producirá ''x'' como una de las cadenas, mientras que hacerlo en t no lo hará, por lo que hay una diferencia en cómo se representan internamente (al menos en Chrome).


¿Algo como esto?

function isDefined(var){ return (typeof(window[var]) == ''undefined'') ? false : true; }

o..

function isDefined(var){ return (window.var === undefined) ? false : true; }


Ach, uno para el hilo anti-patrones allí.

undefined no es una palabra clave.

Cuando asigna write var foo = undefined; le está asignando el valor del símbolo undefined que no ha definido y, por lo tanto, el valor que obtendrá es "undefined" . Produciría exactamente el mismo resultado si lo hubiera asignado UnDeFiNeD o NotFineAtAll o _qwertyuiop

¿Por qué es esto tan terrible? Aparte del hecho de que conduce a una comprensión falsa de lo que está sucediendo, ¿qué ocurre si cargas una biblioteca o contratas a un desarrollador que escribe var undefined = true;


No. No creo que una variable igual a undefined deba ser reconocida como "definida".

Establecerlo como undefined directamente es solo una forma perezosa de eliminarlo, como apuesto a usar la palabra clave delete . Creo que esto solo significa que la recolección de basura no ha afectado la variable / propiedad.

[ EDITAR ]

En cuanto a su comentario sobre hasOwnProperty y propertyIsEnumerable , los prototipos de métodos / propiedades no son ni propios ni enumerables.

Object.prototype.foo = ''something''; var o = {bar: ''anything''}; o.hasOwnProperty(''foo''); //=> false o.hasOwnProperty(''bar''); //=> true Object.prototype.hasOwnProperty(''foo''); //=> true


Podrías intentar poner un reloj en One.x, pero eso solo te diría en el momento en que se vuelva indefinido.


Una forma de hacerlo es esto:

var definedProperties = []; for (var prop in o) definedProperties.push(prop); if (o.x === undefined && contains(prop, ''x'')) { //x is defined, but set to undefined }

donde contains solo comprueba si algún elemento en la matriz es ''x'' . ¿Es esta la única manera?


Una forma un poco más simple que su método es usar el operador Javascript in

alert(''x'' in o); // true alert(''x'' in t); // false


object.hasOwnProperty (name) solo devuelve verdadero para los objetos que están en el mismo objeto y falso para todo lo demás, incluidas las propiedades del prototipo.

function x() { this.another=undefined; }; x.prototype.something=1; x.prototype.nothing=undefined; y = new x; y.hasOwnProperty("something"); //false y.hasOwnProperty("nothing"); //false y.hasOwnProperty("another"); //true "someting" in y; //true "another" in y; //true

Además, la única forma de eliminar una propiedad es usar eliminar. Poniéndolo en indefinido NO lo elimine.

La forma correcta de hacerlo es usarlo como dijo roborg .

Actualización: indefinido es un valor primitivo, consulte la sección de especificaciones de lenguaje de ECMAScript 4.3.2 y 4.3.9.