JavaScript链式赋值a=b=c=5本质是右结合的连续赋值,即a=(b=(c=5)),每步返回被赋值,最终a、b、c均得5;它不传递值或引用,仅重复赋值同一值或同一引用,且未声明变量会隐式创建全局变量。

JavaScript 中的链式赋值(如 a = b = c = 5)并不是“传递数值”的过程,而是从右向左依次执行普通赋值操作,每一步都返回被赋的值,从而让左侧变量逐级接收同一个值。
链式赋值的本质是右结合的连续赋值
JavaScript 赋值运算符 = 是右结合的,这意味着:
a = b = c = 5 等价于 a = (b = (c = 5))
执行顺序如下:
- 先计算
c = 5:把5赋给c,表达式整体返回值为5; - 再执行
b = 5(即上一步的返回值),赋值后返回5; - 最后
a = 5,完成全部赋值。
所以最终 a、b、c 都等于 5,不是“传递”,而是每步都用前一步的返回值继续赋值。
注意:链式赋值不等同于解构或引用共享
它和对象/数组的引用无关,纯属基本赋值行为。例如:
let x, y, z;<br>x = y = z = {};
这里 x、y、z 确实都指向同一个空对象,但这只是因为 {} 是同一个对象字面量被多次赋值——不是链式赋值“传递了引用”,而是每次赋的都是那个对象的引用值。
如果写成:x = y = z = 0;,那就是三个独立的数字,互不影响。
常见陷阱:未声明变量导致全局污染
在非严格模式下,直接写 a = b = 5(而 a、b 均未声明),会隐式创建全局变量 b,而 a 若未声明也会变成全局变量(但实际执行中 b = 5 先发生,a = ... 后发生)。
更安全的写法是显式声明:
-
let a, b, c;<br>a = b = c = 5;
(推荐,所有变量已声明) - 或者用解构实现类似效果:
let [a, b, c] = [5, 5, 5];
扩展:复合赋值符不支持链式使用
像 +=、-= 等复合赋值运算符不能链式使用:
a += b += c += 2 语法合法,但语义易错——它仍是右结合:a += (b += (c += 2)),且每一步都会修改左侧变量。不建议这样写,可读性差,容易引发副作用。
若想清晰赋相同值,优先用多行或数组解构;若需累积计算,请拆开写清楚每步意图。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











