JavaScript中为何typeof name返回string?明明已赋值为number
为啥你的
name变量类型会“翻车”? 哈哈,这个坑我刚学JS的时候也踩过!核心原因是你不小心碰了浏览器全局对象(window)的一个特殊内置属性——window.name。
先拆解你的代码:
const NAME = 'chusss'; var name = 123; console.log(typeof name); // 预期number,实际string console.log(name); // 你看到的"123"其实是字符串类型,只是控制台显示容易让你误以为是数字
关键知识点:
- 在浏览器全局作用域里,用
var声明的变量会自动挂载到window对象上。所以你写的var name = 123,本质就是给window.name赋值。 window.name是个天生有“强迫症”的属性:它的取值永远只能是字符串类型。不管你给它赋数字、布尔值还是对象,JS都会自动把值转换成字符串。比如你赋123,会被转成"123";赋true会变成"true";甚至赋对象会变成"[object Object]"。- 至于
const NAME = 'chusss',因为const(还有let)声明的全局变量不会挂载到window上,所以它和window.name完全没关系,不会影响到后面的name变量。
怎么验证?
你可以在控制台多敲两行代码确认:
console.log(name === "123"); // 返回true,说明它确实是字符串 console.log(window.name === name); // 返回true,证明你操作的就是window的内置name属性
怎么避免这种坑?
- 尽量别在全局作用域用
var声明变量,改用let或const,它们不会挂载到window上,也就不会和内置属性冲突。 - 如果一定要用全局变量,起个独特点的名字,比如加前缀(
myName、appUserName),别用name这种容易撞车的通用命名。
内容的提问来源于stack exchange,提问作者aitchkhan
相关产品推荐
相关产品推荐

