如何在javascript(ES5 / 6)中评估括号(圆括号)

时间:2017-11-07 11:14:46

标签: javascript parentheses

考虑以下情况,可以(例如)用于执行单行交换:

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)?它是一个返回最终值的函数,还是一个数据类型,当访问它时总是会给出最后一个项目,还是其他什么?

为了澄清,我不是在寻找有关如何执行交换的提示,而是对上述语法的解释。

1 个答案:

答案 0 :(得分:5)

这里的关键不在于括号,它只是用于分组,而是comma operator。逗号运算符从左到右计算其操作数,丢弃除最终操作数值之外的结果值,这将成为结果。

这样交换操作就像这样:

  1. 评估作业的右侧b + (b=a, 0)

    1. 获取b的当前值(例如,2)

    2. 评估(b=a, 0)

      1. 评估b=a,将a(1)的当前值指定为b
      2. 丢弃该作业的结果(但保留副作用)
      3. 评估0并将其作为逗号表达式的结果
    3. 所以现在是2 + 0 2

  2. 将该值分配给a

  3. 通过在步骤1.2.1中将a的原始值复制到b并复制a,成功交换bb步骤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);