javascript - 抽象关系比较算法: Why evaluation order is important?

标签 javascript types ecmascript-5 coercion type-coercion

当我在抽象关系比较算法部分中阅读 EcmaScript 规范时,其中包含有关“LeftFirst”参数的信息,并且规范说求值顺序不是重要的原始类型,而是重要的对象类型。 任何人都可以解释一下哪个对象首先评估有什么区别?

http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5 Ecmascript Spesification(又名 ecma-internation.org)第 11.8.5 节(抽象关系比较算法)

最佳答案

抽象关系比较算法评估x < y ,但它用于多个运算符,例如x < y , x > y , x >= y ,有时通过翻转操作数的顺序。以x > y为例,spec for the Greater-than operator说:

Let r be the result of performing abstract relational comparison rval < lval with LeftFirst equal to false.

LeftFirst 对于基元来说并不重要,因为当它们被强制为数字进行比较时没有副作用。然而,对于对象来说可能会有副作用:

const x = { valueOf: _ => console.log( 'x' ) };
const y = { valueOf: _ => console.log( 'y' ) };

y > x;

以上代码日志y然后x 。由于它使用大于运算符,因此它使用 x < y 的抽象关系比较算法与 LeftFirst = false根据上述规范的引用。如果相反,它使用相同的算法,但使用 LeftFirst = true ,那么它最终会在 x 上调用 ToPrimitive在 y 上调用 ToPrimitive 之前,这会导致xy 之前记录.

关于javascript - 抽象关系比较算法: Why evaluation order is important?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57258791/

相关文章:

javascript - executeQueryAsync 在 SharePoint 应用程序中无法正常工作

javascript - jquery如何突出显示子菜单

types - 为什么我可以键入别名函数并在不强制转换的情况下使用它们?

Python: float 或 double

c# - 为什么 C# 不对泛型进行 "simple"类型推断?

javascript - JetBrains WebStorm 智能感知

javascript - 将 queryselectorall 与类一起使用

javascript - 无法从自定义对话框获取文本区域值

javascript - Ajax 成功获取 URL 但未更新页面,而是获取 [object HTMLDivElement]

javascript - 使用 require 问题设置循环依赖