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.