运算符优先级和与Math.Floor(Math.Random())的关联性

时间:2012-12-12 22:37:25

标签: javascript

根据它给出的结果,我理解代码是如何工作的。首先,它获得一个随机数,然后,使用Math.floor(),它会向下舍入Math.Random的结果。因此,它通过代码从右向左移动。

Math.floor(Math.Random * num);

在此url的JavaScript参考中,如下图所示 url

它说,对于点和括号,关联性是“从左到右”。但是,根据我上面摘录的代码,我会说这是“从右到左”。请解释

2 个答案:

答案 0 :(得分:3)

associativity of operators与执行顺序无关,但是如何解析它们。

关联性“从左到右”意味着a.b.c === (a.b).c !== a.(b.c)

当你有一个函数调用时,当然首先评估参数(至少在JS之类的非惰性语言中) - 这也在specification中定义。

这里发生的是:

    根据运算符优先级和关联性规则,
  • Math.floor(Math.Random * num);被解析为AST

-\ invocation
 +-\ function: member operator
 | +-- base: variable "Math"
 | +-- property: "floor"
 +-\ arguments list
   +-\ first: Multiplication
     +-\ left operand: member operator
     | +-- base: variable "Math"
     | +-- property: "Random"
     +-- right operand: variable "num"
  • 评估时,它自上而下发生。调用首先评估其函数,在Mathfloor上调用成员运算符。当评估为vaild函数时,它会继续评估参数。乘法将首先获取其左操作数,从MathRandom上的成员运算符获取 undefined ;然后它获取变量num的值。这导致NaN,现在将调用floor函数,再次返回NaN

答案 1 :(得分:1)

如果不解析其参数,则无法调用函数。这不是运算符优先级(而是执行顺序)的问题。函数调用是左关联的原因是例如以下呼叫正常工作:

foo.bar.baz()

当运算符为左关联时,它等于

((foo.bar).baz)()

等于原始代码。如果它是右关联的,你会得到以下结果:

foo.(bar.(baz())

这显然会做一些完全不同的事情,而这些事情很可能完全不起作用。

顺便说一下,函数调用与成员运算符的优先级不同。有关此主题的更多参考信息,请参阅MDN,而不是您在问题中链接的那个。