2010-12-10 1 views
4

Comme mentionné dans la rubrique JS, les bonnes parties semblent prétendre qu'une valeur de propriété ne peut pas être indéfinie. Toutefois, si vous effectuez les opérations suivantes dans la console de Chrome par exemple:Pourquoi "Javascript the Good Parts" affirme-t-il que "Une valeur de propriété peut être n'importe quelle valeur Javascript sauf pour undefined"?

var foo = {} 
foo.bar = undefined 
foo 

Cliquez ensuite pour développer l'objet foo vous pouvez voir encore que foo contient une propriété appelée bar avec la valeur indéfinie. Bien sûr, du côté Javascript, vous ne pouvez pas faire la différence entre foo.bar renvoyant undefined et foo.unexistingproperty renvoyant undefined. Mais quel est le point de la console toujours accroché à la propriété qui a été définie à indéfini?

+1

Je pense que vous pourriez appeler cela une «fonctionnalité» Chrome assez inutile :) – sje397

+3

@ sje397: Pas inutile du tout. Il y a une différence entre une propriété existante et étant indéfinie et une propriété non existante. Vois ma réponse. –

+0

Donc, comme beaucoup de réponses dit je sais que vous pouvez utiliser supprimer pour se débarrasser de la propriété et ainsi de suite. Mais l'idée principale avec ma question était pourquoi le livre prétend que la valeur ne peut pas être indéfinie. Clairement ceci semble être une déclaration incorrecte par Crockford. – Sam

Répondre

3

undefined est la manière de Javascript de vous indiquer qu'une valeur n'existe pas au lieu de lancer une erreur lorsque vous accédez à la propriété sans bloc try/catch. Bien que techniquement ce que Chrome affiche est faux par le compte de Crockford, il est au moins logique; la propriété existe, bien que undefined.

Lorsque vous souhaitez supprimer une propriété, vous pouvez utiliser le delete operator:

delete foo.bar; 
+3

Vous ne recevez pas d'erreur lorsque vous essayez d'accéder à une propriété non définie. Vous obtenez seulement une erreur lorsque vous essayez d'accéder à une variable non déclarée. Et si le livre de Crockford dit que c'est Crockford qui a tort, pas Chrome. –

+0

Je ne disais pas que vous obtiendriez une erreur, je dis juste que Javascript renvoie 'undefined' comme un mécanisme alternatif pour lancer une erreur _Property not found_. –

+1

OK. Bien que JavaScript génère des erreurs en général, l'accès à une propriété non définie semble être quelque chose que JavaScript attend et ne considère pas comme une erreur. –

4

Techniquement, est une valeur valide définie pour assigner à une variable. Cela fait une différence mais généralement pas utile:

var foo = { 
    bar: undefined 
}; 

foo.hasOwnProperty("bar"); // returns true 
foo.hasOwnProperty("bat"); // returns false 

aussi:

for (var n in foo) { 
    console.log(n, foo[n]); // should log "bar" and "undefined" 
} 

Personnellement, je suivre les conseils donnés par Crockford dans ce cas. L'attribution d'une valeur undefined peut conduire à un code prêtant à confusion et devrait donc être considérée comme mauvaise. Cela surprend les gens qui ne s'y attendent pas.

Nous avons déjà null à utiliser à cette fin, ce qui est moins déroutant pour les futurs responsables. Soit undefined signifie vraiment pas défini et utiliser null pour signifier pas connu. Rappelez-vous que lorsque vous lisez le livre de Crockford, vous lisez des conseils sur les meilleures pratiques et l'opinion sur la façon dont javascript devrait travailler selon lui. Comment javascript effectivement fonctionne est une question tout à fait différente (et selon lui pas nécessairement bon).

+3

Le contexte dans lequel Crockford fait la déclaration n'est pas un conseil ou une opinion, mais une déclaration de fait. Le paragraphe complet est "Un objet est un conteneur de propriétés, où une propriété a un nom et une valeur.Un nom de propriété peut être n'importe quelle chaîne, y compris la chaîne vide.Une valeur de propriété peut être n'importe quelle valeur JavaScript sauf pour undefined." –

+0

Le contexte de l'ensemble du livre est l'opinion de Crockford et des conseils sur la façon dont vous devriez penser à javascript. Citation du livre lui-même: "..Je puce les caractéristiques qui ne sont pas belles ..". Tout le livre parle de l'opinion de Crockford sur les faits, pas sur les faits en soi. Il admet volontiers qu'il n'est pas intéressé par la description de javascript lui-même, mais qu'il veut plutôt transmettre le sous-ensemble de javascript qu'il pense que la langue aurait dû être en premier lieu. Si vous voulez un livre qui décrit ou définit javascript alors ce n'est pas ça. – slebetman

+0

Oui, Crockford dit en effet dans la préface de son livre, "..I chip chip les fonctionnalités qui ne sont pas belles .." pour révéler un sous-ensemble de JS qui est fiable, lisible et maintenable. Cependant, sa phrase sur aucune valeur de propriété peut être 'non défini 'n'est pas vrai sur Chrome et FF, et il ne semble pas tomber dans la catégorie de son opinion. Il réserve son opinion pour les annexes du livre. Il écrit en outre: "Ce livre ne tentera pas de décrire complètement la langue, mais plutôt de se concentrer sur les bonnes parties avec un avertissement occasionnel pour éviter les mauvaises". Je pense qu'il vient de faire une erreur dans Ch3. –

7

Il existe une différence entre une propriété existante et étant indéfinie et une propriété inexistante, c'est pourquoi Chrome est judicieux ici. Si vous affectez une valeur à une propriété, la propriété existe fondamentalement dans cet objet. Une différence est qu'une propriété qui a été explicitement définie comme indéfinie affichera dans une boucle for...in:

var foo = {}; 
foo.bar = undefined; 

// The following will alert "bar" 
for (var i in foo) { 
    alert(i); 
} 

Une autre est que "bar" in foo retournera true, tout comme foo.hasOwnProperty("bar").

+0

Je suppose qu'un ajout utile pourrait être de mentionner l'utilité de déclarer des vars pour une utilisation dans la portée globale. Quelque chose que vous couvrez, mais que vous n'avez pas noté (par exemple var a; function doSomething() {a = (a)? 0: 1; renvoie a;} – fncomp

Questions connexes