的Javascript变量强制转换为字符串,为什么?
问题描述:
考虑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
为什么会出现这种情况?如果我直接复制/粘贴代码,也会发生这种情况。如果我砍name
的n
的,然后它的工作。如果我改变的变量myName
它的工作。为什么它被强制为一个字符串?我正在使用Chrome的Version 57.0.2987.133 (64-bit)
。它也发生在Firefox 52.0.2 (64-bits)
。
这时候我在节点或在Internet Explorer中运行的代码不会发生。
答
因为你使用name
在浏览器全球范围内。的browers已经有一个内置的name
全球(特别是财产window
,这是窗口的名称name
),这始终是一个字符串。或者:
使用不同的名称,或者更好的
不要使用全局
这就是为什么不使用全局变量的一个很好的例子是一个好主意。 :-)
这里是#2的例子:
(function() {
var name = 0;
while (name < 6) {
console.log('Masha');
name = name + 1;
console.log(name);
}
})();
现在name
没有一个全球性的了(你阴影它称为name
局部变量), 一切都很好。
在这种适当支持ES2015的let
*,你也可以使用let
,因为let
(和const
和class
)创建的变量是全局的,但不是全局对象的属性浏览器。你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
循环的情况)的情况也是如此。
检查答案在这里[链接](http://stackoverflow.com/questions/10523701/using-the-variable-name-doesnt-work-with-a-js-object) –
道歉的双重职位。 –