为什么浏览器中执行`var name=42`得到的是字符串而非数字?
问题复现
你提到的代码运行效果如下:
// 浏览器环境运行结果 >>> var x = 42; >>> x+1; 43 >>> var name = 42; >>> name+1; "421"
浏览器中两个变量行为差异的原因
- 在浏览器全局作用域通过
var声明的变量,会自动挂载到全局对象window上。 window本身存在内置的自有属性window.name,该属性的设计用途是存储窗口名称,强制要求值为字符串类型:任何赋值给window.name的内容都会被自动转换为字符串。- 当你执行
var name = 42时,本质是给已有的window.name赋值,42会被自动转为字符串"42"。后续执行name + 1时触发字符串拼接逻辑,最终得到"421"。如果是在函数局部作用域声明name变量,不会触发全局属性的覆盖,就不会出现自动转字符串的情况。 - 变量x不存在与内置属性冲突的问题,声明后就是普通的Number类型值42,执行
x+1时触发数值加法,得到43。
Node.js与浏览器结果不同的原因
- Node.js的全局对象是
global(最新标准也可通过globalThis访问),该全局对象没有内置的name属性。 - 在Node全局作用域执行
var name = 42时,就是声明了一个普通的Number类型变量,没有自动转字符串的逻辑,因此name + 1执行数值加法得到43,和x的表现完全一致。
内容的提问来源于stack exchange,提问作者pschill
相关产品推荐
相关产品推荐

