javascript(ES5/6)中的圆括号(圆括号)是如何求值的
How are parentheses (round brackets) evaluated in javascript (ES5/6)
考虑以下情况,它可以(作为示例)用于执行单线交换:
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)
?它是一个返回最终值的函数,还是一个在访问时总是给出最后一项的数据类型,还是其他什么?
澄清一下,我不是在寻找有关如何执行交换的提示,而是在寻找对上述语法的解释。
这里的关键不在于括号,它们只是用于分组,而是 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
,并复制 b
,成功交换了 a
和 b
] 的原始值在步骤 1.1(在更改 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);
考虑以下情况,它可以(作为示例)用于执行单线交换:
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)
?它是一个返回最终值的函数,还是一个在访问时总是给出最后一项的数据类型,还是其他什么?
澄清一下,我不是在寻找有关如何执行交换的提示,而是在寻找对上述语法的解释。
这里的关键不在于括号,它们只是用于分组,而是 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
,并复制 b
,成功交换了 a
和 b
] 的原始值在步骤 1.1(在更改 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);