“从右到左的运算符关联性”是不是与 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 中赋值运算符中的求值顺序相同的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript&jQuery.DOM事件

JQuery 是不是支持字典(键、值)集合?

管理信息系统的开发与管理

TypeError: jQuery(...).dataTable 不是 Grails 中的函数

webpack入门与笔记

Sea.js 手册与文档