Chrome中代码var y = 1, x = y = typeof x;为何x等于1而非"undefined"?
为什么
var y = 1, x = y = typeof x;执行后x不是"undefined"而是1? 首先得澄清一个关键点:按照ECMAScript规范以及Chrome 65版本的实际执行结果,这段代码运行后x的值应该是**"undefined"**,而不是1。如果你得到x=1,大概率是执行环境有残留变量,或者代码输入有误。不过我们先详细拆解这段代码的执行逻辑,帮你理清背后的原理:
1. 变量提升(Hoisting)
JavaScript中,var声明的变量会被提升到当前作用域的顶部。也就是说,在代码正式执行前,x和y已经被创建出来,初始值为undefined(处于未初始化状态)。
2. 赋值操作的右结合性
赋值运算符=是右结合的,简单来说,a = b = c等价于a = (b = c)。我们把你的代码拆解成更直观的执行步骤:
// 变量提升后,相当于先执行了这一步(只是隐式的): var x, y; // 然后依次执行初始化逻辑: y = 1; x = (y = typeof x);
3. 逐步骤解析执行过程
- 第一步:
y = 1→y被赋值为1,此时y的值是1。 - 第二步:计算
typeof x→ 此时x已经被声明(虽然还没赋值),所以typeof x返回字符串"undefined"。 - 第三步:
y = "undefined"→ 把y的值从1覆盖为"undefined",这个赋值表达式的结果就是赋值后的y值(也就是"undefined")。 - 第四步:
x = "undefined"→ 把x赋值为第三步的结果,也就是"undefined"。
所以最终x和y的值都是"undefined"。
为什么你会得到x=1?
如果你的控制台显示x=1,可能的原因包括:
- 执行这段代码前,作用域中已经存在
x或y的残留值(比如之前执行过x=1,没有清空控制台或切换作用域)。 - 代码输入错误,比如实际执行的是
var y = 1, x = y;(少写了typeof x部分)。 - 对控制台显示的误解:
var语句本身的返回值是undefined,你需要手动执行console.log(x)才能看到x的实际值,不要把语句的返回值当成变量的值。
内容的提问来源于stack exchange,提问作者Rantiev
相关产品推荐
相关产品推荐

