如何在javascript(ES5/6)中计算圆括号(圆括号)

如何在javascript(ES5/6)中计算圆括号(圆括号),javascript,parentheses,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)?它是一个返回最终值的函数,还是一个在访问时总是给出最后一项的数据类型,还是其他什么 为了澄清

考虑以下情况,可(作为示例)用于执行单线交换:

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



为了澄清这一点,我不是在寻找如何执行交换的技巧,而是对上述语法的解释。

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

因此,交换操作的工作原理如下:

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

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

  • 评估
    (b=a,0)

  • 计算
    b=a
    ,将
    a
    (1)的当前值分配给
    b
  • 丢掉作业的结果(但保留副作用)
  • 计算
    0
    并将其作为逗号表达式的结果
  • 现在是
    2+0
    ,也就是
    2

  • 将该值分配给
    a

  • 因此,通过在步骤1.2.1中将
    a
    的原始值复制到
    b
    ,并在步骤1.1中将
    b
    的原始值复制到
    a
    (在更改
    b
    之前获取该值)和步骤2(将该值放入
    a
    ),可以成功地交换
    a
    b


    旁注:进行交换的现代(ES2015+)方法是使用分解表示法:

    ([a, b] = [b, a]);
    
    实例:

    设a=1,b=2;
    ([a,b]=[b,a]);
    控制台日志(“a”,a);
    
    控制台日志(“b”,b)这里的关键不在于括号,括号只是用来分组的,而在于。逗号运算符从左到右计算其操作数,丢弃除最终操作数值以外的结果值,最终操作数值将成为结果

    因此,交换操作的工作原理如下:

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

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

  • 评估
    (b=a,0)

  • 计算
    b=a
    ,将
    a
    (1)的当前值分配给
    b
  • 丢掉作业的结果(但保留副作用)
  • 计算
    0
    并将其作为逗号表达式的结果
  • 现在是
    2+0
    ,也就是
    2

  • 将该值分配给
    a

  • 因此,通过在步骤1.2.1中将
    a
    的原始值复制到
    b
    ,并在步骤1.1中将
    b
    的原始值复制到
    a
    (在更改
    b
    之前获取该值)和步骤2(将该值放入
    a
    ),可以成功地交换
    a
    b


    旁注:进行交换的现代(ES2015+)方法是使用分解表示法:

    ([a, b] = [b, a]);
    
    实例:

    设a=1,b=2;
    ([a,b]=[b,a]);
    控制台日志(“a”,a);
    
    控制台日志(“b”,b)
    ()
    创建表达式。逗号(
    )是一个运算符,返回最后一个值。对于es6中的交换,请使用
    [a,b]=[b,a]
    顺便说一句,您的交换仅对数字有效。
    ()
    创建一个表达式。逗号(
    )是一个运算符,返回最后一个值。对于es6中的交换,请使用
    [a,b]=[b,a]
    顺便说一句,您的交换仅适用于数字。Ace回答,尽管我担心这会成为一个关于交换的讨论,这不是我的意图,而我现在看到的是逗号运算符。狡猾的小操作员。@OlivierButler:这只是结尾的旁注。大部分答案都是对这个鬼鬼祟祟的部分的解释。:-)反思一下,你说得很对,值得一提的是,解构作业作为一个整体并没有得到很好的理解,上面的帖子可能会错误地教导如何有效地交换。Ace回答,尽管我担心这会成为一个关于交换的讨论,而不是我现在看到的逗号运算符。狡猾的小操作员。@OlivierButler:这只是结尾的旁注。大部分答案都是对这个鬼鬼祟祟的部分的解释。:-)反思一下,你说得很对,值得一提的是,解构任务作为一个整体并没有得到很好的理解,上面的文章可能会错误地教导如何有效地交换。