JavaScript赋值运算符含复合赋值(如+=)和连续赋值(如a=b=c):前者等价于“变量=变量运算表达式”且左值只读一次,后者按从右向左链式执行并返回赋值结果。

JavaScript 中的赋值运算符不仅能做简单赋值(=),还能通过复合赋值(如 +=、-=)简化操作,也支持连续赋值(如 a = b = c),但两者行为逻辑不同,容易混淆。
复合赋值运算符:先计算再赋值
复合赋值是「运算 + 赋值」的缩写,形式为 变量 运算符= 表达式,等价于 变量 = 变量 运算符 表达式,但左侧变量只被读取一次(对对象/数组等引用类型更安全)。
-
x += 5等价于x = x + 5 -
y *= 2等价于y = y * 2 -
arr.push(1) += 0不合法 —— 复合赋值左边必须是**可赋值的左值(lvalue)**,比如变量、对象属性、数组元素,不能是函数调用或表达式结果 - 注意副作用:若左侧含函数调用(如
obj.getProp() += 1),ES2024 规范要求getProp()只执行一次,避免重复求值
连续赋值:从右向左链式赋值
连续赋值如 a = b = c 实际按 a = (b = c) 执行,即先算 b = c(返回 c 的值),再把该值赋给 a。本质是多个赋值表达式串联,每个都返回被赋的值。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
let x, y; x = y = 10;→y先得 10,表达式y = 10返回 10,再赋给x - 在非严格模式下,
var a = b = 10会让b成为全局变量(因缺少var声明);严格模式会报错ReferenceError - 对象属性连续赋值:
obj.a = obj.b = 5是安全的,但obj.a = (obj.b = 5)更清晰,尤其当obj是表达式时(如getObj().a = getObj().b = 1会调用两次getObj(),应避免)
复合赋值与连续赋值不能混用
像 a += b = c 是合法语法,但含义是 a = a + (b = c),即先执行 b = c,再用其返回值参与加法。这不是“同时复合又连续”,而是嵌套表达式。
立即学习“Java免费学习笔记(深入)”;
-
let a = 1, b; a += b = 2;→b得 2,a变成1 + 2 = 3 - 不支持
a += b += c这类写法:因为b += c是左值,但复合赋值本身不是左值,无法再作为+=的左侧 - 连续复合赋值无意义,JavaScript 不支持类似
a += b += c或a =+ b =+ c(后者是a = +b = +c,会报错)
实用建议与常见陷阱
写赋值逻辑时,优先保证可读性与安全性:
- 简单场景用复合赋值(
i++、sum += item),简洁且高效 - 连续赋值慎用于声明后初始化,避免隐式全局;多变量同值推荐分别写或用解构:
let [a, b] = [5, 5] - 涉及对象、数组或 getter/setter 时,避免在复合或连续赋值中重复访问同一表达式,改用临时变量缓存
- 调试时注意:赋值表达式的返回值可用于条件判断,例如
if ((x = getValue()) !== null) { ... },但需加括号防止误解析

















