Javascript, var name = 1, "typeof name" donne "string"?

J'ai trouvé ce problème étrange, lorsque j'écris le code Javascript comme ci-dessous:

var name = 1; alert(typeof name); // this will alert "string" var b = 1; alert(typeof b); // this will alert "number" 

J'ai obtenu "string" pour "typeof name", mais j'ai "number" pour "typeof b", mais je pense qu'ils doivent tous deux être "number"

Et ce code ne fonctionnera pas non plus:

 var name = 1; if (name === 1) { alert("ok") } 

Il ne sera pas alerté, car le type de nom est "string"!

J'ai testé le code ci-dessus dans Chrome et Safari, ils donnent tous deux le même résultat, alors pourquoi "typeof name" est "string" dans ce cas? Pourquoi le nom de la variable "nom" est-il si spécial?

C'est un comportement du navigateur où certaines propriétés de l'objet de fenêtre, comme le nom et l'état ne prendront que des valeurs de chaîne, si vous attribuez un autre type de valeurs, la valeur toString () de cet objet lui est attribuée

 var name = 1; console.log(typeof name); // this will alert "string" var status = 1; console.log(status, typeof status); //gives '1` and string var status = {}; console.log(status, typeof status);//gives value of status as [object Object] since that is the toString() implementation of object var b = 1; console.log(typeof b); // 

Demo: Fiddle


Ce comportement n'est pas applicable si vous utilisez des variables locales … c.-à-d. Des variables dans une fonction

 function test(){ var name = 1; console.log(typeof name); // this will alert "string" var status = 1; console.log(status, typeof status); //gives '1` and string var status = {}; console.log(status, typeof status);//gives value of status as [object Object] since that is the toString() implementation of object var b = 1; console.log(typeof b); // } test() 

Demo: Fiddle

La raison en est qu'il existe une propriété sous la window nommée name ( window.name ) et elle est déjà définie comme une chaîne.

Lorsque vous déclarez une variable sans portée, elle est scopée sous window .

En savoir plus sur window.name .