Chrome中status变量异常求助:赋值数组后取值不符合预期
解析Chrome中
status变量的异常输出问题 这是个很容易踩中的浏览器全局环境坑,咱们一步步拆解原因和解决办法:
核心问题:status不是普通全局变量
在Chrome等浏览器的全局作用域里,status其实是**window.status的简写**——这个属性原本是用来控制浏览器状态栏显示文本的,它有一个特殊的强制行为:任何赋值给它的值都会被自动转换为字符串类型。
当你执行这段代码时:
var foo = ["70036", "70374"]; var status = ["70036", "70374"]; console.log(status[0]); // 输出7 console.log(foo[0]); // 输出70036
foo是你创建的普通数组变量,所以访问foo[0]正常返回数组第一个元素。- 而
status的赋值其实是给window.status赋值,数组会被自动调用toString()方法转成字符串:"70036,70374"。这时候你用status[0]访问的是字符串的第一个字符,也就是"7",这就是异常输出的原因。
为什么赋值时没报错?
ECMAScript标准里status并不是保留字,但浏览器在全局环境中预先定义了window.status这个可写属性。当你在全局作用域用var status声明时,由于window已经存在这个属性,var不会创建新变量,而是直接覆盖window.status的赋值——而这个属性的setter只负责转类型,不会阻止赋值,所以控制台没有报错。
新标签页输入status返回""的原因
默认情况下,浏览器新标签页的window.status就是空字符串,没有被修改过,所以直接输入status会返回这个默认值。
解决办法
有两种简单的方式避开这个坑:
- 换变量名:比如用
statusArray、statusList这类不会和浏览器内置属性冲突的名字。 - 使用局部作用域:把
status变量放在函数内部,这样它就不会和全局的window.status关联:function testStatus() { const status = ["70036", "70374"]; console.log(status[0]); // 正常输出70036 } const foo = ["70036", "70374"]; testStatus(); console.log(foo[0]); // 输出70036
内容的提问来源于stack exchange,提问作者Ryan McDonough
相关产品推荐
相关产品推荐

