请解释这个 JavaScript 怪异行为

3

我认识的一个刚学习编程的人遇到了这个问题,让我感到困惑:

请在控制台(Chrome/Firefox)中输入:var name = ['what', 'the', '...?'];

我本来期望name是一个字符串数组,但是:

  • typeof name 显示 string 而不是 Array
  • 列出 name 变量会打印出一个字符串而不是一个数组
  • name.length13 而不是 3
  • 写下 name = name.split(',') 会返回预期的数组 ["what", "the", "...?"],但是 name 仍然是一个 string 而不是一个数组

name 是唯一一个表现出这种行为的变量名,至少我没有找到其他的。

这只是一个控制台的怪癖,还是一个 JavaScript 引擎的 bug,或者说是什么?

注意:上述情况发生在 Chrome 和 Firefox 上。IE Edge 出人意料地按预期工作(typeof nameArray 等等)。未在其他浏览器上测试。


1
尝试使用除 name 以外的变量名。https://developer.mozilla.org/zh-CN/docs/Web/API/Window/name - j08691
1个回答

6

window.name是DOM中的全局字符串。

请注意,您可以通过在函数作用域中声明变量来解决此问题:

(function() {
   var name = ['foo', 'bar'];
   console.log(typeof name);
})();

至于为什么IE/Edge不同 - 这是它们对规范的解释,很可能已经存在了多年。现在更改会导致破坏性变化。


1
那为什么在Edge中没有发生呢?!! - niceman
实际上,默认的 window.name 似乎是一个具有 setter 的属性,它将被分配的任何值转换为字符串。如果你 delete window.name 然后再试一次,你会得到一个预期的数组。 @DanielA.White 请更新您的答案以包括此内容。谢谢 :) - Teodor Sandu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接