Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
324 views
in Technique[技术] by (71.8m points)

JavaScript 两个对象大小比较的机制?

偶然见看到的一个关于类型转换的题目:

对象 ab 是两个字面量函数,在进行比较的时候,可以发现大小和相等的比较结果都是 false

var a = {b: 42};
var b = {b: 43};
a < b; //false
a == b; //false 
a > b; //false

a <= b; //true 
a >= b; //true 

在这个过程之,a 和 b 比较的时候,到底比较的是什么?为什么 <=> 三个运算符都是 false。?

为什么 a<=b 是 true?
a<=b == true 是因为 JS 计算的是 !(a>b) 吗?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

ES 规定如此。

==!= 不说了,基础问题了;说下 >< 这种吧,最后都会转换为数值形式做比较。

首先尝试调用对象的 Symbol.toPrimitive 方法得到原始值。

如果没有这个方法就再尝试调用 valueOf

经过以上转换后,如果两边都是 string,则按 Unicode 逐位比较;否则,都强转成 number 比较。

Object 强转后就变成了 NaNNaN 是个特殊的 number,它跟任意数(包括它自己)做任何比较运算,恒为 false

至于 >=<= 你说的对,确实是取反。


P.S. 完整讲述可以自己搜索一下 ECMA-262 文档中关于 Abstract Relational Comparison 的相关定义:https://tc39.es/ecma262/#sec-abstract-relational-comparison


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...