【问题标题】:Why is the Javascript operator "&&" so weird?为什么 Javascript 运算符“&&”这么奇怪?
【发布时间】:2013-05-13 08:52:45
【问题描述】:
a = 1;
b = "1";
if (a == b && a = 1) {
    console.log("a==b");
}

上面的 Javascript 代码将导致 Google Chrome 26.0.1410.43 中 if 语句中的错误

未捕获的 ReferenceError:分配中的左侧无效

我认为这是因为不能赋值语句&&a=1第二部分中的变量a。但是,当我尝试下面的代码时,我完全糊涂了!

a = 1;
b = "1";
if (a = 1 && a == b) {
    console.log("a==b");
}

为什么一个说法正确而另一个说法错误?

【问题讨论】:

  • 你到底想在这里完成什么?代码实际上应该做什么?
  • 始终使用() 作为运算符优先级
  • 你这里写错了,要这样写if(a==1 && a == b)

标签: javascript google-chrome operator-precedence


【解决方案1】:

if (a = 1 && a == b)

首先要执行的操作是1 && a == b。 1 && 执行a == b 的结果。此&& 操作的结果分配给a

【讨论】:

  • 这并不完全正确。 == 的优先级高于 &&。这导致以下评估顺序: 1. 1 2. && -> 左侧已经为真,不要评估右侧 3. a = 1 结果与您所说的相同。但是 1 && a 不会首先被评估,它是 1 && (a == b) ,其中 a == b 永远不会被评估。一般来说,对于 a = b && c == d,评估顺序将是(假设 b 是假的): 1. b 2. c == d 3. b && (c == d) 4. a = (b && ( c == d))
  • 我的评论也是错误的;)这次你做对了。如果 a 为真,则仅对给定 a && b 的 b 进行评估。在我上一条评论中,我说 a 必须是假的。
【解决方案2】:

第二个版本被解析为a = (1 && a == b);即表达式1 && a == b的结果赋值给a

第一个版本不起作用,因为分配的左侧未按预期解析。它会解析表达式,就好像您正在尝试为右侧的 everything 分配一个值--(a == b && a) = 1

这一切都基于各种运算符的优先级。这里的问题源于= 的优先级低于其他运算符。

【讨论】:

【解决方案3】:

= has lower operator precendence than both && and ==,表示你的第一个作业变成了

if ((a == b && a) = 1) {

由于您不能以这种方式分配给表达式,这将给您一个错误。

【讨论】:

    【解决方案4】:

    因为操作的顺序不是你所期望的。 a == b && a = 1 等价于(a == b && a) = 1 等价于false = 1

    如果你真的想做这个作业,你需要用括号括起来:a == b && (a = 1)

    【讨论】:

      猜你喜欢
      • 2012-07-29
      • 2015-06-06
      • 2013-12-09
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      相关资源
      最近更新 更多