基本上来说是 name 宣告后被其他机制复写
而变量会被复写,代表有其他地方在操作这个变量
也就是涉及变量作用范围 scope 的问题
从这段code里面,name 是用 var 需告,
并且没有被放置在任何函数底下,是被放置在函数外的
基本上他会是个全域变量
而在浏览器环境底下,全域方法或者变量,就是直接在 window 物件底下
所以当你设定一个 name 的全域变量,是等价于 window.name
如同 nodejs 环境是挂载在 global 物件底下
global object 这部分可以参考
https://developer.mozilla.org/en-US/docs/Glossary/Global_object
那为何 name 明明被宣告成阵列,却被转为字串?
原因在于 window.name 他被预期是一个字串
而浏览器会用 toString 方法将所有他的赋值转成字串
window.name 可参考 mozilla 文件:
https://developer.mozilla.org/en-US/docs/Web/API/Window/name
所以浏览器处理 var name = new Array(10);
其实他执行的是 var name = new Array(10); name = name.toString();
并且字串并没有提供 a[...] 来改变字串值的方法
底下的 name[...] = ... 都是没有作用的
最后才会得到 ,,,,,,,,,
至于 chrome 不能,IE 可以,则是前端另一个坑
只要是涉及浏览器执行或显示的,例如JS/CSS
可能会随着浏览器种类以及版本,会有些微不同的表现...
最后如果真的要用 name 这个变量怎办?
那就把他包在 function 里面,让 name 变成 local variable
https://imgur.com/YxlNJCq
或者使用 es6 语法的 let, const 来宣告
避免 var 有全域变量的问题
https://imgur.com/ZOnSumE