2017-04-10 130 views
0

考虑followng代码的Javascript变量强制转换为字符串,为什么?

<!DOCTYPE html> 
<html> 
<head> 
<script> 
    var name = 0; 
     while (name < 6) { 
      console.log('Masha'); 
      name = name + 1; 
      console.log(name); 
     } 

</script> 
</head> 
<body> 

</body> 
</html> 

我希望在Chrome开发者工具的输出是:

Masha 
name.html:9 1 
name.html:7 Masha 
name.html:9 2 
name.html:7 Masha 
name.html:9 3 
name.html:7 Masha 
name.html:9 4 
name.html:7 Masha 
name.html:9 5 
name.html:7 Masha 
name.html:9 6 

相反,我得到

Masha 
name.html:9 01 
name.html:7 Masha 
name.html:9 011 

为什么会出现这种情况?如果我直接复制/粘贴代码,也会发生这种情况。如果我砍namen的,然后它的工作。如果我改变的变量myName它的工作。为什么它被强制为一个字符串?我正在使用Chrome的Version 57.0.2987.133 (64-bit)。它也发生在Firefox 52.0.2 (64-bits)

这时候我在节点或在Internet Explorer中运行的代码不会发生。

example output

+0

检查答案在这里[链接](http://stackoverflow.com/questions/10523701/using-the-variable-name-doesnt-work-with-a-js-object) –

+0

道歉的双重职位。 –

回答

5

因为你使用name在浏览器全球范围内。的browers已经有一个内置的name全球(特别是财产window,这是窗口的名称name),这始终是一个字符串。或者:

  1. 使用不同的名称,或者更好的

  2. 不要使用全局

这就是为什么不使用全局变量的一个很好的例子是一个好主意。 :-)

这里是#2的例子:

(function() { 
 
    var name = 0; 
 
    while (name < 6) { 
 
     console.log('Masha'); 
 
     name = name + 1; 
 
     console.log(name); 
 
    } 
 
})();

现在name没有一个全球性的了(你阴影它称为name局部变量), 一切都很好。

在这种适当支持ES2015的let *,你也可以使用let,因为let(和constclass)创建的变量是全局的,但不是全局对象的属性浏览器。你let name阴影,即使在全球范围内来自属性的全局:

let name = 0; 
 
while (name < 6) { 
 
    console.log('Masha'); 
 
    name = name + 1; 
 
    console.log(name); 
 
}

但同样,只是没有使用全球最好。


*注:某些浏览器有let但不正确的ES2015语义,如IE11(它缺少周围let一些重要的功能在for循环头声明,它不给每次循环迭代其自己a,对于在for正文中创建的闭包产生影响),但大多数现代浏览器  —当然Chrome,Firefox和Edge   —支持它正确。和IE11的let作品在上面(只是不for循环的情况)的情况也是如此。

相关问题