为何Chrome/Firefox无法将纯数字字符串作为window对象属性名?
为什么Chrome/Firefox没法把纯数字字符串当window对象的属性名?
嘿,这个问题我之前也碰到过,本质是window对象不是普通的JavaScript对象——它是浏览器全局环境的载体,还和DOM的Window接口、全局变量规则绑定在一起,约束比普通对象严格得多。
给你理清楚核心逻辑:
- 普通JS对象确实像文档描述的那样,支持任何有效字符串作为属性名。比如你写
const obj = {}; obj["0"] = "test"; console.log(obj["0"]);,在所有浏览器里都能正常输出test,完全没问题。 - 但window不一样:Chrome、Firefox这类现代浏览器会对纯数字字符串的属性名做特殊限制。原因是window的属性会直接映射成全局变量,而ECMAScript规范明确要求,全局变量的标识符不能以数字开头(标识符得是字母、下划线或者
$开头,后面才能加数字)。所以当你执行window["0"] = "hello"时,浏览器表面上返回了赋值结果,但实际上并没有把这个键值对真正存在window对象里,后续再读window["0"]自然就是undefined了。 - 至于IE11,它的处理逻辑没那么严格,没有遵循这个规范,所以允许纯数字字符串当window的属性名,读写都正常。
如果非要存这类键值对,给你两个简单方案:
- 自己创建一个普通的全局对象来存储:
// 先在window上挂载一个普通对象 window.globalStore = {}; // 然后随便存纯数字键 window.globalStore["0"] = "hello"; console.log(window.globalStore["0"]); // 正常输出"hello" - 用Map来存储,Map支持任意类型的键,完全不受标识符规则限制:
const globalMap = new Map(); globalMap.set("0", "hello"); console.log(globalMap.get("0")); // 输出"hello"
内容的提问来源于stack exchange,提问作者dlynch
相关产品推荐
相关产品推荐

