2012-03-01 4 views
2

Je ne suis pas quelqu'un qui a fait beaucoup en javascript. Mon parcours est en Java/C++. Je travaille actuellement sur un projet qui utilise beaucoup de javascript et je suis tombé sur quelque chose qui n'a pas de sens pour moi mais j'espère que certains gourous javascript là-bas peuvent me donner une bonne explication logique.Javascript non défini, les chaînes vides, et si les déclarations

var noDefinition = undefined; 
var emptyString = ""; 
var noDefinitionAndEmptyString = noDefinition + emptyString; 

console.log("NoDefinition"); 
console.log(noDefinition); 

console.log("EmptyString"); 
console.log(emptyString); 

console.log("noDefinition+emptyString"); 
console.log(noDefinitionAndEmptyString); 

console.log("************************"); 
if(noDefinition == undefined) 
{ 
    console.log("No Definition is undefined"); 
} 


if(emptyString == undefined) 
{ 
    console.log("emptyString is undefined"); 
} 

if(noDefinitionAndEmptyString == undefined) 
{ 
    console.log("noDefiniton and emptyString is undefined"); 
} 

Le code ci-dessus produit les résultats suivants dans la console:
[INFO] NoDefinition
[INFO]
[INFO] EmptyString
[INFO]
[INFO] noDefinition + emptyString
[INFO] undefined
[INFO] * ** * ** * ** * **
[INFO] Aucune définition n'est pas défini

Comme vous pouvez le voir quand je sortie les variables noDefinition et emptyString à la console, il produit une sortie vide. Quand je les concatène, la console produira un indéfini. Cependant, si je continue à utiliser une instruction if et compare chacun d'entre eux à undefined. Le seul qui s'exécute est le premier.

Cela se produit même si, mis à une console, la valeur apparaît simplement vide. Aussi la concaténation qui apparaît comme indéfinie dans la console échoue sa comparaison contre undefined et ne s'exécute jamais. Je suis confus par cela et j'espère que quelqu'un peut me donner une explication sur ce qui se passe.

+0

double possible de [Javascript: non défini == undefined?!] (http: // pile overflow.com/questions/776950/javascript-undefined-undefined) –

Répondre

2

Lorsque vous concaténer non défini avec une chaîne, il devient une chaîne

var foo = undefined; 
var bar = ""; 
console.log(foo+bar, typeof(foo+bar)); 
* output * 
undefined string 

ECMAScript Docs - http://www.ecmascript.org/docs.php Je ne sais pas, mais la lecture de la doc sur la page 141 vous pouvez trouver ce

15.5.1 Le constructeur de chaîne appelé comme une fonction

Lorsque String est appelé en tant que fonction plutôt qu'en tant que constructeur, il effectue une conversion de type .

Ce qui me permet de croire pourquoi concaténation de quoi que ce soit avec une chaîne affiche une chaîne

0

Utilisez ce lieu:

if (typeof noDefinition == "undefined") ... 
+1

C'est une meilleure approche: if (typeof noDefinition === "undefined") –

2
  1. console.log n'imprime rien quand il reçoit une valeur undefined (spécifique à la mise en œuvre). Lorsque vous concaténez undefined avec une chaîne vide, la valeur résultante est "undefined". C'est imprimé.

Les points précédents expliquent vos observations.

0

noDefinitionAndEmptyString est en fait un string (vous pouvez utiliser console.info(typeof noDefinitionAndEmptyString)) et sa valeur est 'non défini'. Cela se produit à cause de la concaténation - une distribution implicite à string se produit, et variable non définie, casté en chaîne, est la chaîne « undefined »

0

if(noDefinition == null) couvre « undefined » typeof et typeof « null », mais vous pouvez ajouter et une déclaration pour s'assurer que ce n'est pas une chaîne vide ...comme si:

if(noDefinitionAndEmptyString == null || noDefinitionAndEmptyString == "")

1

Réécriture votre exemple pourrait jeter plus de lumière sur ce qui se passe réellement quand concaténer une chaîne et une valeur non définie:

var noDefinition = undefined; 
var emptyString = ""; 
var noDefinitionAndEmptyString = noDefinition + emptyString; 
console.log("************************"); 
console.log("NoDefinition:" + " " + noDefinition + " " + typeof(noDefinition)); 

console.log("EmptyString:"+ " " + emptyString + " " + typeof(emptyString)); 

console.log("noDefinition+emptyString: " + noDefinitionAndEmptyString + " " + typeof(noDefinitionAndEmptyString)); 

console.log("************************"); 

Résultats dans:

************************ 
NoDefinition: undefined undefined 
EmptyString: string 
noDefinition+emptyString: undefined string 
************************ 
Questions connexes