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

时间:2017-04-10 14:43:11

标签: javascript

考虑以下代码

double data[][];
if(winner)
   data=new double[16][5];
else
   data=new double[14][5];

我希望Chrome开发者工具中的输出为:

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

相反,我得到

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 的{​​{1}},那么它确实有效。如果我将变量更改为n,它确实有效。为什么它被强制转换为字符串?我正在使用name Chrome。它也发生在Firefox myName

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

example output

1 个答案:

答案 0 :(得分:5)

因为您在浏览器中使用全局范围内的name。浏览器已经有一个内置的name全局(特别是name的属性window,这是窗口的名称),它始终是一个字符串。之一:

  1. 使用其他名称或更好的名称:

  2. 请勿使用全球

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

    以下是#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循环情况)。