考虑以下情况,可以(例如)用于执行单行交换:
let a = (10,20)
console.log(a)
> 20
执行交换的示例
let a = 1, b = 2
a = b + (b=a, 0)
console.log(a, b)
>2,1
我习惯于看到包含函数声明的括号创建自调用函数,但我不确定在上述情况下发生了什么。如何通过javascript来处理(10,20)
或(b=a, 0)
?它是一个返回最终值的函数,还是一个数据类型,当访问它时总是会给出最后一个项目,还是其他什么?
为了澄清,我不是在寻找有关如何执行交换的提示,而是对上述语法的解释。
答案 0 :(得分:5)
这里的关键不在于括号,它只是用于分组,而是comma operator。逗号运算符从左到右计算其操作数,丢弃除最终操作数值之外的结果值,这将成为结果。
这样交换操作就像这样:
评估作业的右侧b + (b=a, 0)
获取b
的当前值(例如,2)
评估(b=a, 0)
b=a
,将a
(1)的当前值指定为b
0
并将其作为逗号表达式的结果所以现在是2 + 0
2
将该值分配给a
通过在步骤1.2.1中将a
的原始值复制到b
并复制a
,成功交换b
和b
步骤1.1中的a
的原始值(在更改b
之前获取值)和步骤2(将该值放在a
中)。
旁注:现代(ES2015 +)进行交换的方法是使用解构表示法:
([a, b] = [b, a]);
直播示例:
let a= 1, b = 2;
([a, b] = [b, a]);
console.log("a", a);
console.log("b", b);