【问题标题】:Precedence If Clause Parenthesis and Equality [duplicate]如果子句括号和相等的优先级[重复]
【发布时间】:2019-11-15 18:32:34
【问题描述】:

括号的优先级高于相等。

所以根据我的理解,优先级越高。

现在假设我比较了未定义的a

if (a == 1) { .. // throws an exception because a is not defined

实际案例:

if (typeof a !== 'undefined' && (a == 1)) {
  console.log(1)
} else {  
  console.log(2)
}

应按此顺序评估:

  1. (typeof a !== 'undefined' && (a == 1))
  2. (a == 1)
  3. 类型
  4. 结果来自 (3) !== 'undefined'
  5. “(4) 的结果” && “(2) 的结果”

但是如果 a 没有定义但它没有定义,这通常会抛出异常。

为什么等式左边的优先级较低,但首先计算它?

编辑:我改编了 '||' 中的示例到&& 只是因为|| 总是会抛出。

【问题讨论】:

  • Parens 不添加“权重”,它们将通常不会的操作组合在一起:a || b && c || d vs (a || b) && (c || d)
  • 您从哪里获得优先级的值?如果语句字面上从左到右,比较结果(无论类型如何)。
  • 在小学算术课上,他们将运算符优先级和评估顺序的概念混为一谈——在3 + 4 - (5 + 6) 之类的东西中,他们告诉你先计算5 + 6,然后再计算3 + 4 - 11——这很好,因为只要您尊重运算符优先级,求值顺序在算术中并不重要。但是在编程中,计算顺序通常确实很重要(因为表达式可能有副作用),您需要将这些概念分开;尊重运算符优先级是不够的。
  • 好的 - 这只会影响 if 语句从左到右运行之前的计算。 if (2 + 3 * 4 == 3 * 2 + 1) 将正确计算 if (14 == 7) 但它只是一个 if 语句。从左到右 - 总是。

标签: javascript node.js


【解决方案1】:

|| 被评估 left-to-right:

5 逻辑 OR 从左到右 ... || …

所以首先被评估的内部表达式是typeof a,作为typeof a !== 'undefined'的一部分。

如果|| 的右侧包含更多嵌套在括号中的表达式,则无论它们的运算符优先级如何,它们只会在|| 的左侧被计算后才被计算。

【讨论】:

  • && 不也是从左到右评估的吗?不是每个if 声明吗?
  • 是的,大多数事物是从左到右评估的,就像您在 MDN 链接上看到的那样(尽管它是 per expression,而不是 每条语句)
  • 是的,但不应将优先于20 的内括号计算在5 之上?
  • @AndiGiga 不,外部表达式是||,因此|| 的左侧将在右侧的任何内容之前计算,无论任何运算符的优先级如何恰好嵌套在右侧
  • 但不会是if (someVar && (someConditional == someBool)) 等于if (someVar && someConditional == someBool)
猜你喜欢
  • 1970-01-01
  • 2012-09-19
  • 2012-08-19
  • 1970-01-01
  • 2012-07-11
  • 2012-12-16
  • 1970-01-01
  • 2019-08-15
  • 2017-11-16
相关资源
最近更新 更多