37 votes

JavaScript - Identifie si une propriété est définie et définie sur 'non défini' ou non défini

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 à l' undefined. o.hasOwnProperty('x') et t.hasOwnProperty('x') sera à la fois return false; il en va de même pour l' propertyIsEnumerable. Deux questions:

  • Est-il possible de dire que l'o.x est définie et fixée à l' undefined?
  • Est-il jamais une raison pour? (si les deux sémantiquement équivalent?)

Une petite mise en garde: faire (pour propName o) boucle de rendement " x " comme l'une des cordes, tout en faisant en t sera pas si il y a une différence dans la façon dont ils sont représentés en interne (au moins dans Chrome).

66voto

Greg Points 132247

Une méthode légèrement plus simple que votre méthode consiste à utiliser l' opérateur Javascript in

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

8voto

some Points 18965

objet.hasOwnProperty(nom) renvoie uniquement vrai pour les objets qui sont dans le même objet, et false pour tout le reste, y compris les propriétés dans le 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 de faire supprimer une propriété est l'utilisation de supprimer. Le paramètre non défini, ne le supprimez PAS.

La bonne façon de le faire est d'utiliser dans comme roborg dit.

Mise à jour: undefined est une valeur primitive, voir la Spécification du Langage ECMAScript section 4.3.2 et 4.3.9.

4voto

annakata Points 42676

Ach, l'un pour les anti-modèles de thread là.

undefined n'est pas un mot-clé.

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

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

1voto

adam Points 10572

Quelque chose comme ça?

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

ou..

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

1voto

Jonathan Lonowski Points 45253

Pas de. Je ne pense pas qu'une variable est égale à undefined devrait être reconnu comme "défini".

Définir égal à undefined directement est juste une manière paresseuse de la suppression de lui, aussi apposées à l'aide de l' delete mot-clé. Je crois que cela signifie que la collecte des ordures n'a pas eu d'effet sur la variable ou de la propriété.


[MODIFIER]

Concernant votre commentaire sur hasOwnProperty et propertyIsEnumerable, prototype des méthodes/propriétés ne sont ni l'objet, ni énumérable.

Object.prototype.foo = 'something';

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

Object.prototype.hasOwnProperty('foo');  //=> true

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X