JavaScript - Déterminer si une propriété est définie et réglée sur « non défini », ou non définie

StackOverflow https://stackoverflow.com/questions/385960

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).

Était-ce utile?

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.

Mise à jour: undefined est une valeur primitive, voir

Ach, un pour le fil anti-il des motifs.

undefined n'est pas un mot-clé.

Lorsque vous attribuez écrire var foo = undefined; vous lui attribuer la valeur du undefined symbole que vous n'avez pas défini et donc la valeur que vous obtiendrez est "undefined". Vous produirez exactement le même résultat si vous aviez assigné UnDeFiNeD ou NotFineAtAll ou _qwertyuiop

Pourquoi est-ce si terrible? Eh bien en dehors du fait qu'elle conduit à une fausse compréhension de ce qui se passe, ce qui se passe si vous arrivez à charger une bibliothèque ou d'embaucher un dev qui écrit var undefined = true;

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
}

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.

scroll top