JavaScript - Déterminer si une propriété est définie et réglée sur « non défini », ou non définie
-
23-08-2019 - |
Question
Dire que j'ai le code suivant:
function One() {}
One.prototype.x = undefined;
function Two() {}
var o = new One();
var t = new Two();
o.x
et t.x
permettra à la fois d'évaluer à undefined
. o.hasOwnProperty('x')
et t.hasOwnProperty('x')
retournera les deux faux; la même chose pour propertyIsEnumerable
. Deux questions:
- Est-il possible de dire que o.x est défini et mis à
undefined
? - Y at-il jamais aucune raison de? (Si les deux sémantiquement équivalent?)
Une petite mise en garde: faire (pour propName en o) boucle donné « x » comme l'une des cordes, tout en faisant en t sera pas - donc il y a une différence dans la façon dont ils sont représentés en interne (au moins en Chrome).
La solution
Une façon un peu plus simple que votre méthode est d'utiliser le Javascript dans l'opérateur
alert('x' in o); // true
alert('x' in t); // false
Autres conseils
object.hasOwnProperty (nom) ne renvoie true pour les objets qui se trouvent dans le même objet, et faux pour tout le reste, y compris les propriétés du prototype.
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
En outre, la seule façon ne supprimer une propriété est d'utiliser supprimer. Un réglage undefined ne le supprimez pas.
La bonne façon de le faire est d'utiliser comme roborg dit.
Quelque chose comme ça?
function isDefined(var){
return (typeof(window[var]) == 'undefined') ? false : true;
}
ou ..
function isDefined(var){
return (window.var === undefined) ? false : true;
}
Non. Je ne pense pas une variable égale à undefined
doit être reconnue comme « définie ».
Un réglage égal à undefined
est directement juste une façon paresseuse de le supprimer - par opposition à l'aide du mot-clé delete
. Je crois que cela signifie simplement que la collecte des ordures n'a pas pris effet sur la variable / propriété.
[ EDIT ]
En ce qui concerne vos commentaires sur hasOwnProperty
et propertyIsEnumerable
, les méthodes de prototypes / propriétés ne sont ni l'objet propre, ni dénombrable.
Object.prototype.foo = 'something';
var o = {bar: 'anything'};
o.hasOwnProperty('foo'); //=> false
o.hasOwnProperty('bar'); //=> true
Object.prototype.hasOwnProperty('foo'); //=> true
Une façon de le faire est la suivante:
var definedProperties = [];
for (var prop in o) definedProperties.push(prop);
if (o.x === undefined && contains(prop, 'x')) {
//x is defined, but set to undefined
}
où contains
vérifie simplement si un élément du tableau est 'x'
. Est-ce la seule façon?
Vous pouvez essayer de mettre une montre sur One.x mais ce serait seulement vous dire au moment où il se défini.