gpt4 book ai didi

Javascript 为什么将变量强制转换为字符串?

转载 作者:行者123 更新时间:2023-11-28 13:10:00 25 4
gpt4 key购买 nike

考虑以下代码

<!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

为什么会出现这样的情况呢?如果我直接复制/粘贴代码也会发生这种情况。如果我砍nname然后它就起作用了。如果我将变量更改为 myName它确实有效。为什么它被强制为字符串?我正在使用Version 57.0.2987.133 (64-bit) Chrome 。它也发生在 Firefox 52.0.2 (64-bits) .

当我在 Node 或 Internet Explorer 中运行代码时,不会发生这种情况。

example output

最佳答案

因为您正在使用name在浏览器中的全局范围内。浏览器已经内置了name全局(具体来说, name 的属性 window ,它是窗口的名称),它始终是一个字符串。要么:

  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 循环情况)。

关于Javascript 为什么将变量强制转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43326199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com