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.