“从右到左的运算符关联性”是不是与 javaScript 中赋值运算符中的求值顺序相同
Posted
技术标签:
【中文标题】“从右到左的运算符关联性”是不是与 javaScript 中赋值运算符中的求值顺序相同【英文标题】:Is "right to left operator Associativity" the same as the order of evaluation in assignment operator in javaScript“从右到左的运算符关联性”是否与 javaScript 中赋值运算符中的求值顺序相同 【发布时间】:2020-06-17 01:57:03 【问题描述】:我需要知道 operator Associativity 是否与 javascript 中赋值运算符和其他运算符的 求值顺序 相同
var x;
x = 10;
在上面的代码中,我需要知道赋值表达式x = 10;
是从“从右到左”还是从“从左到右”执行的,因为运算符关联性赋值运算符的“从右到左” 我有点担心像x = 10;
这样的正常赋值表达式是如何执行的。它是从“右到左”还是“从左到右”执行的,如下面的代码,您可以看到赋值表达式是从右到左执行的。
var y;
var z;
y = z = 10; // In this snippet you can see that both the variables "y" and "z" hold the value of number 10 this means that the Assignment operator is executed from "right to left";
// Now i must know whether a normal Assignment operator is also executed from "right to left" because Assignment operator is having "right to left" Associativity;
var c;
c = 10; // Not sure whether how and to which side this assignment expression is executed is it executed from "left to right" or "right to left"
【问题讨论】:
如果 JS 中的“从左到右”分配有效,那么10 = x
应该可以完美运行。
无论表达式中包含多少操作,JavaScript 中的赋值运算符都是右关联的:a = b = 10;
和 a = 10;
都是右关联的。您可以在 MDN 上查看 op 表和每个运算符的关联性:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
@HunterMcMillen 你好,所以你的意思是正常的赋值表达式也是从“右到左”执行的
@AlexMichailidis 我认为在你的情况下赋值表达式是从“左到右”执行的,因为首先它必须检查左操作数,这通常是一个变量,但在你的情况下它是一个数字。数字“10”所以因为赋值运算符是从左到右执行的,只有你的代码给出了错误
等号的右侧分配给左侧。别想太多了
【参考方案1】:
答案可以在 Operator Precedence 的 MDN 页面中找到(强调我的):
关联性决定了具有相同优先级的运算符如何 解析。例如,考虑一个表达式:
a OP b OP c
左结合(left-to-right)表示处理为
(a OP b) OP c
,而右结合(right-to-left)表示处理为(a OP b) OP c
解释为a OP (b OP c)
。
只有当您有多个具有相同优先级的运算符时,关联性才会发挥作用。如果您有多个赋值运算符,它们会从右到左进行计算 - 但每个单独的赋值运算符仍在将 right 操作数分配给 left 名称。
在你的代码 sn-p:
y = z = 10;
这相当于:
y = (z = 10);
由于赋值运算符的计算结果为分配的值 (10),因此在分配了 z
之后,您将得到 y = 10;
。
如果您只有 one 运算符,则关联性不适用。在赋值运算符中,右操作数被分配给左操作数,句号。它们的评估顺序由上面 MDN 页面中列出的运算符优先级决定。
【讨论】:
另外,为了强化 Klaycon 刚才所说的:a = 1 + 3 * 4 * 4
仍将首先执行乘法 *
操作(它们相邻的从左到右或从右到左),因为此运算符的 优先级 高于 +
。这符合代数的一般规则。结果将是49
。
@Klaycon 如果x = y = 10;
是从右到左执行的,我可以知道这是如何执行的吗x = 10;
是x = 10;
像x = y = 10;
一样从右到左执行?
@Kevin “从右到左执行”是模棱两可的。赋值运算符=
首先计算右操作数,然后将其值赋给左操作数。 x = 10
首先评估 10
,然后将其分配给 x
。由于运算符关联性,x = y = 10;
首先被解析为 x = (y = 10)
,然后首先评估 y = 10
,然后将 x
分配给 y = 10
评估的结果。
@Klaycon 那么你如何证明赋值运算符是从右到左执行的
@Kevin 您能否详细说明为什么这是您的问题或为什么需要证明它?你有一些与执行顺序有关的问题吗?看来您可能遇到了 XY 问题,即其他一些问题被误诊为执行顺序问题以上是关于“从右到左的运算符关联性”是不是与 javaScript 中赋值运算符中的求值顺序相同的主要内容,如果未能解决你的问题,请参考以下文章