赋值运算符内的赋值运算符

An assignment operator inside an assignment operator

'use strict';

let apples = '3';
let bananas = '4';

console.log(+apples + (apples = +bananas + 3));

输出结果是10,出乎意料。我以为会是 14,编译器会这样想

  1. console.log(+苹果+(苹果=+香蕉+3));

  2. console.log(+苹果+(苹果=4+3));

  3. console.log(+苹果+(苹果=7)); //变量 'apples' 将变为 7

  4. console.log(+苹果+7); //'apples' 现在等于 7

  5. console.log(7 + 7);

  6. console.log(14)

  7. 14

但是在第4步,'apples'显然等于3。为什么输出不是14?


update: 是不是每个操作数都有括号,不是直接写的,而是自动加上的?

  1. console.log((+苹果) + ((苹果 = (+香蕉) + (3)))); //由于括号现在具有相同的优先级(顺序),操作从左到右完成

  2. console.log(3 + (苹果 = 4 + 3));

  3. console.log(3 + (苹果 = 7)); //变量 'apples' 将变为 7

  4. console.log(3 + 7); //'apples' 现在等于 7

  5. console.log(3 + 7);

  6. console.log(10)

  7. 10

我认为,这可以从逻辑上解释为什么有 10 个而不是 14 个。


对于笨拙的代码,我们深表歉意。刚看完js中的运算符就开始练习了

在第 4 步中,apples 的值不是 7,因为代码示例中的表达式是从左到右求值的。

所以下面的表达式:

+apples + (apples = +bananas + 3)

被评估为:

  1. apples的值强制转换为数字

    3 + (apples = +bananas + 3)
    
  2. bananas的值强制转换为数字

    3 + (apples = 4 + 3)
    
  3. 4 + 3相加并将相加结果赋值给apples

    3 + (apples = 7)
    
  4. (apples = 7) - 这个表达式的值为 7

    3 + 7
    

最终结果 = 10。