相等和不相等 如果两个数相等(==),则返回true
如果两个数不等(!=),则返回true
这两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性
在转换不同的数据类型时,它们遵循下列基本规则:
如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,true转换为1
如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
对象或数组类型,优先调用valueOf方法,次之调用toString方法(重写的情况下),一般情况数组优先调用toString方法,得到的原始值按前面的规则比较
null与undefined相等
要比较相等性之前,不能将null和undefined转换成其他任何值
如果存在NaN,直接返回false
如果两个操作数都是对象,要比较它们是否是同一个对象,如果两个操作数指向同一个对象,返回true,否则返回false
对于第三点的补充说明
因为数组的valueOf方法默认返回原数组,并不能进行比较,所以一般优先调用toString方法
一般的转换流程:
如果是原始值,直接返回原始值
不是原始值,调用该对象的ValueOf方法,如果结果是原始值,返回原始值
调用valueOf方法不是原始值,调用此对象的toString方法,如果结果是原始值,返回原始值
如果返回的不是原始值,抛出异常
而在==比较中我们经常需要把原始值转换成数值
一些例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 null == undefined 'NaN' == NaN false == 0 true == 2 undefined == 0 null == 0 let a = { valueOf:function ( ) { return '333' ; } }let b = [444 ,333 ]; b.toString = function ( ) { return '333' ; } b.valueOf = function ( ) { return '444' ; } a=='333' b=='333' a==b let a = { toString ( ) { return '444' ; } } a==444 b==444 []==false
介绍下常见数据类型的valueOf与toString
toString返回的都是String类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 let n = 1 ;console .log(n.valueOf()); console .log(n.toString());let str = 'abc' ;console .log(str.valueOf()); console .log(str.toString()); let bool = true ;console .log(bool.valueOf()); console .log(bool.toString());let obj = {}console .log(obj.valueOf()); console .log(obj.toString()); let sym = Symbol (str);console .log(sym.valueOf()); console .log(sym.toString()); let big = 1n ;console .log(big.valueOf()); console .log(big.toString()); let fn = function ( ) { console .log('我是一个函数' ) }console .log(fn.valueOf()); console .log(fn.toString());let dat = new Date ()console .log(dat.valueOf()); console .log(dat.toString()); let arr = [1 ,2 ,3 ];console .log(arr.valueOf()); console .log(arr.toString());
全等和不全等 全等(===)
只有类型和值都一致时才为true
不全等(!==)