【问题标题】:JavaScript strange behavior with operator precedence!!!1具有运算符优先级的 JavaScript 奇怪行为!!!1
【发布时间】:2019-04-17 06:44:33
【问题描述】:

你认为这个表达式会产生什么结果?

var a = 10;
a = a + (a = 5);
console.log(a);

// a = 10?

不! 15岁!

现在让我们看看另一个类似的说法:

var a = 10;
    a = (a = 5) + a;
    console.log(a);
    
    // a = 15? 

再次不,现在是 10。这是为什么呢?我无法理解。但是等等,还有两个:

var a = 10;
a = a + a++;
console.log(a);

// a = 21? Haha no! Its 20!

最后一个:

var a = 10;
a = a++ + a;
console.log(a);

// 21))) now my mind is blown away (

那么谁能告诉我,为什么 javascript 会这样?

【问题讨论】:

  • 我只是想知道为什么他们是正确的,我不是说他们不是
  • 前两个例子怎么样?
  • 虽然您的所有问题都基于同一个 basic 问题(当我多次为同一个变量赋值时,操作的执行顺序是什么?在同一个表达式中?——这首先是一个糟糕的想法),我投票结束这个过于宽泛,因为它们是单独的问题(而且每个问题可能都有单独的重复项) .
  • “括号中的表达式必须先求值?” 这不是括号的意思。我想有人可以说它们会影响评估的顺序(但这并不一定意味着它们首先被评估,想象一下你有多组括号,它们不能一起成为“第一”)。相反,它们会更改操作数/运算符和运算符的优先级,这会影响评估顺序。例如。 3 * 4 + 53 * (4 + 5) 不同。 x * y 的 LHS,即 3 仍然首先被评估。区别在于评估 RHS,44 + 5

标签: javascript operators operator-precedence


【解决方案1】:

为了更好地理解这一点,让我们考虑另一个变量

案例 1

var a = 10;
a = a + (a = 5); 
console.log(a); // 15

a = 10;
var b = a + (a = 5);
console.log(a); // 5
console.log(b); // 15
a + (a = 5)
5 + (a = 5) // here a is assigned a value 5 and bracket returns 5
5 + 5 // here value of a is 5
10 // value will be assigned to variable on LHS

案例 2

var a = 10;
a = (a = 5) + a;
console.log(a); // 10


a = 10;
var b = (a = 5) + a;
console.log(a); // 5
console.log(b); // 10
(a = 5) + a
(a = 5) + a // here a is assigned a value 5 and bracket returns value 5
5 + 5 // here value of a is 5
10 // value will be assigned to variable on LHS

案例 3

var a = 10;
a = a + a++;
console.log(a); // 20

a = 10;
var b = a + a++;
console.log(a); // 11
console.log(b); // 20
a + a++ // post increment i.e. it will return the value first and then increment
10 + 10 // where value of a will 10 + 1 i.e. 11 
20 // value will be assigned to variable on LHS

案例 4

var a = 10;
a = a++ + a;
console.log(a); // 21

a = 10;
var b = a++ + a;
console.log(a); // 11
console.log(b); // 21
a++ + a // post increment i.e. it will return the value first and then increment
10 + a // where value of a will 10 + 1 i.e. 11
10 + 11 // as value of a is 11
21 // value will be assigned to variable on LHS

【讨论】:

    【解决方案2】:

    var a = 10;
    a = a + (a = 5);
    console.log(a);
    
    // a = 10?

    是 15,因为 a 的值是 10,然后你添加了 (a = 5),这将 a 的值更改为5. 因此,你做了 10+5。

    var a = 10;
        a = (a = 5) + a;
        console.log(a);
        
        // a = 15? 

    现在您首先有了 (a = 5),您要在 添加 a 之前将其值更改为 5。因此,您正在做 5+5。

    希望这会有所帮助。

    【讨论】:

    • 但是括号里的表达式必须先求值,我以为运算符优先级是什么意思
    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2014-11-03
    相关资源
    最近更新 更多