【问题标题】:What is the order of precedence for modulus in Javascript?Javascript中模数的优先顺序是什么?
【发布时间】:2016-07-05 08:55:54
【问题描述】:

如果我有以下代码

var num = 15 % 2 + 6 * 4;

例如...我想知道输出是什么,特别是我想知道模数的优先顺序(由% 符号执行的操作)。加法和乘法运算之前或之后会进行取模吗?

编辑:我已经看过人们将我链接到的文章

MDN Operator Precedence

并且在提出问题之前已经这样做了,但不幸的是它没有包含足够的信息来完全回答我的问题,因此我在这里提问。只是为了节省人们再次链接的工作量。

更新:调查associativity 作为建议答案下方的 cmets 讨论的迹象是,该问题与关联性相关(如果您原谅意外的双关语)。

更新:语法编辑 (^_^?)

【问题讨论】:

  • 你为什么不试试呢?
  • 这是你真正应该只是 looking up 而不是在 Stackoverflow 上回答的东西。
  • developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 显示模数与除法和乘法命令具有相同的优先级,但我想知道哪个会先发生,乘法或模数,或者是否可能有一些其他变量控制哪个可能首先发生。
  • 关于输出,使用labs.codecademy.com,我通过示例代码得到25num 变量值,但var num = 3 * 15 % 2 + 6 * 4; 也导致num 变量console.log显示还带有值25...
  • 很明显,您查看的表格表明% 的优先级高于+。那么问题出在哪里?

标签: javascript operator-precedence modulus


【解决方案1】:

从技术上讲,它是remainder operator(比我更多的数学头脑说模数会以不同的方式处理符号差异),它具有与乘法和除法相同的优先级和关联性。

所以

var num = 15 % 2 + 6 * 4;

var num = (15 % 2) + (6 * 4);

MDN 在运算符优先级和关联性上有a handy article


你对这个问题的评论:

...我通过示例代码获得了25num 变量值,但var num = 3 * 15 % 2 + 6 * 4; 也导致num 变量console.log 显示为也承载25 的值...

这是因为15 % 2 + 6 * 43 * 15 % 2 + 6 * 4 都是25。让我们分解一下:

你的第一个例子:15 % 2 + 6 * 4

15 % 2 + 6 * 4
1      + 6 * 4
1      + 24
25

你的第二个例子:3 * 15 % 2 + 6 * 4

3 * 15 % 2 + 6 * 4
45     % 2 + 6 * 4
1          + 6 * 4
1          + 24
25

【讨论】:

  • 那么它们的执行顺序与编译器解析它们的顺序相同吗?
  • @PeterDavidCarter:不,它们是按照语言规范定义的顺序执行的,这是完全不同的。编译器将按%+* 的顺序解析它们,但它们将按%*+ 的顺序执行。它们解析的顺序在这里无关紧要。
  • 所以余数运算符 (modulus/%) 将在乘法运算符 (*) 之前执行,这就是您所说的吗?我在这里读对了吗?
  • @PeterDavidCarter:同样,解析在这里无关紧要;这是相关的执行。是的,大多数数学(不是全部)都是从左到右的关联性,但优先级胜过关联性。我应该指出,这基本上与 JavaScript 无关; JavaScript 只是遵循关于基本运算符的基本算术约定。该规则在某些地方称为 PEMDAS,在其他地方称为 BODMAS。 (并且应该写为 PE(MD)(AS) 或 BO(DM)(AS),因为在这两种情况下,M 和 D 具有相同的优先级,A 和 S 也是如此。)
  • @PeterDavidCarter 在这个问题的示例中清楚地表明它并没有真正产生数学差异(暂时忽略可能的浮点问题);你真的想要确定的是什么?你有副作用的表达吗?你真的关心浮点问题吗?
【解决方案2】:

基本上你从左到右,但你先做加,然后乘,然后除,剩下的东西是除。所以

 var num = 15 % 2 + 6 * 4;

基本上是 15 % 2 = 1

【讨论】:

  • 它会给你 25,但答案是第一个 :)
【解决方案3】:

模数应该与除法、乘法和指数具有相同的优先级。见here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多