我了解代码的工作原理,就其给出的结果而言。首先,它获取一个随机数,其次,使用 Math.floor() 将 Math.Random 的结果四舍五入。因此,它在代码中从右向左移动。
Math.floor(Math.Random * num);
在此 url的 JavaScript 参考中,如下图所示
它说,对于点和括号,关联性是“从左到右”。但是,根据我上面摘录的代码,我会说它是“从右到左”。请解释
我了解代码的工作原理,就其给出的结果而言。首先,它获取一个随机数,其次,使用 Math.floor() 将 Math.Random 的结果四舍五入。因此,它在代码中从右向左移动。
Math.floor(Math.Random * num);
在此 url的 JavaScript 参考中,如下图所示
它说,对于点和括号,关联性是“从左到右”。但是,根据我上面摘录的代码,我会说它是“从右到左”。请解释
运算符的关联性与它们的执行顺序无关,而与它们的解析方式无关。
关联性“从左到右”意味着a.b.c === (a.b).c !== a.(b.c)
.
当你有一个函数调用时,当然首先评估参数(至少在像 JS 这样的非惰性语言中) - 这也在规范中定义。
这里发生的是:
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"
Math
and上调用成员运算符floor
。当 this 评估为有效函数时,它会继续评估参数。乘法将首先获取其左操作数,从成员运算符 on and获得undefined;然后它获取变量的值。这导致,现在将调用 floor-function ,再次返回。Math
Random
num
NaN
NaN
一个函数的参数没有被解析就不能被调用。这不是运算符优先级(而是执行顺序)的问题。函数调用是左关联的原因是为了使例如以下调用正常工作:
foo.bar.baz()
由于运算符是左关联的,这等于
((foo.bar).baz)()
这等于原始代码。如果它是右关联的,您将获得以下信息:
foo.(bar.(baz())
这显然会做一些完全不同的事情,这很可能根本不起作用。
顺便说一句,函数调用的优先级与成员运算符不同。有关此主题的更好参考,请参阅MDN,而不是您在问题中链接的参考。