前奏 看看 ==
N表示ToNumber操作,即将操作数转为数字。
P表示ToPrimitive操作,即将操作数转为原始类型的值(Undefined、Null、Boolean、Number和String等五种)

-
undefined == null,结果是true。且它俩与所有其他值比较的结果都是false。
-
String == Boolean,需要两个操作数同时转为Number。
-
String/Boolean == Number,需要String/Boolean转为Number。
-
Object == Primitive,需要Object转为Primitive(具体通过valueOf和toString方法)。
重点 看看 valueof() 和 toString()
所有JS数据类型都拥有valueOf和toString这两个方法,null和 undefined 除外。它们继承自Object(即 Object.prototype.valueOf()和 Object.prototype.toString()),当然也可能被子类重写。
是否重写 toString() 和 valueOf() 和 其返回值是否为原始数据类型,影响比较结果
1. 都重写时: 有操作符 且 valueOf()返回值是非原始类型 且 console.log( a == b) ,b为非原始类型时,两个方法都不调其实。

2.都重写时: 有操作符 且 valueOf()返回值是原始类型 :valueOf()优先级高于toString()

3. 都重写时: 有操作符 且 valueOf()返回值是非原始类型 :两个方法都调(先调用 valueOf() 再 toString() ) 给人一种假象 toString()优先级高于valueOf()

4. 只重写了 toString() : toString()优先级高于valueOf()

5.只重写了valueOf() : valueOf()优先级高于toString()

6.都不重写 :默认调用的valueof() :可以通过== 和 === 比较看。


7. console 中打印展示 有可能 不调用 valueOf 而并非 [1,2] 和 [1,2] 为两块地址而显示false 的理解。



拓展:toString()可以判断数据类型

遗留的问题:图上的报错说对象不能转化成基本类型 为什么?希望大家能帮我解答哈

本文深入探讨JavaScript中不同数据类型间的转换与比较规则,包括ToNumber、ToPrimitive操作及对象与原始类型之间的转换过程。重点讲解valueOf和toString方法的作用与调用优先级,以及这些方法如何影响比较结果。
1138

被折叠的 条评论
为什么被折叠?



