当我阅读抽象关系比较算法部分中的 EcmaScript 规范时,有关于“LeftFirst”参数的信息,并且规范说评估顺序不是重要的原始类型而是重要的对象类型。任何人都可以解释我首先评估的对象有什么区别?http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5 Ecmascript Spesification(又名 ecma-internation.org)第 11.8.5 节(抽象关系比较算法)
1 回答
![?](http://img1.sycdn.imooc.com/54586870000183e302200220-100-100.jpg)
慕妹3242003
TA贡献1824条经验 获得超6个赞
抽象关系比较算法对 求值x < y,但它用于多个运算符 EG x < y、x > y、x >= y,有时通过翻转操作数的顺序。在 的情况下x > y,大于运算符的规范说:
令 r 是执行抽象关系比较 rval < lval 且 LeftFirst 等于 false 的结果。
LeftFirst 对原语无关紧要,因为当它们被强制为数字进行比较时没有副作用。但是,对于对象可能存在副作用:
const x = { valueOf: _ => console.log( 'x' ) };
const y = { valueOf: _ => console.log( 'y' ) };
y > x;
上面的代码记录y
然后x
。由于它采用了大于运营商,它采用了抽象关系比较算法x < y
与LeftFirst = false
按从规格上面的报价。相反,如果它使用相同的算法,但使用LeftFirst = true
,那么它最终会在调用 ToPrimitive onx
之前调用 ToPrimitive on y
,这将导致x
在 之前记录y
。
添加回答
举报
0/150
提交
取消