【问题标题】:The Abstract Relational Comparison Algorithm: Why evaluation order is important?抽象关系比较算法:为什么评估顺序很重要?
【发布时间】:2019-07-29 17:32:22
【问题描述】:

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

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

【问题讨论】:

标签: javascript types ecmascript-5 coercion type-coercion


【解决方案1】:

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

令 r 为执行抽象关系比较的结果 rval

LeftFirst 对于基元来说无关紧要,因为当它们被强制为数字进行比较时没有副作用。但是,对于对象可能会有副作用:

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

y > x;

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

【讨论】:

猜你喜欢
  • 2016-12-22
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
相关资源
最近更新 更多