当我在抽象关系比较算法部分中阅读 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 之前,这会导致x
在 y
之前记录.
关于javascript - 抽象关系比较算法: Why evaluation order is important?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57258791/