算数运算
首先都转成原始类型,然后查看下面三条规则
- 类型不同,转成数字,然后运算
- (特殊)两个运算中有一个是字符串,进行字符串拼接
- (特殊)有一个是NaN,结果是NaN
例1
console.log(null + undefined) //NaN,等价于0+NaN
都是基本类型了,两条特殊规则不匹配,且类型不同,所以需要转成数字后比较,转换规则可以看这篇js的类型转换,Number(null)->0,Number(undefined)->NaN,所以结果为NaN
例2
console.log([]+{});//[object Object]
都不是原始类型,转成原始类型,[]调用valueOf得到是[],是一个对象,继续调用toString(),得到空字符串'',
{}调用valueOf得到{},继续调用toString,得到'[object Object]',两个结果相加
比较运算
<,>,<=,>=
需要转成原始类型在比较
- 类型不同,转为数字类型,然后比较
- (特殊):两个都是字符串,比较字符串编码值
- (特殊):两端存在NaN,一定为false
例子
console.log(null>{})//false
{}不是原始类型需要转换在比较,{}转成'[object Object]',然后再转成数字类型NaN,最终等价于null>NaN,结果返回false
===
- 类型和值都相等才返回true
- (特殊):两端存在NaN,返回false
==
- 类型相同,比较值
- 都是原始类型,转成数字比较
- 有一端是对象类型,对象转成原始类型后比较
- (特殊):undefined和null只有自身比较或相互比较才会是true,其他情况跟某一个比较都是返回false
- (特殊):两端存在NaN,返回false
例1
console.log(null==0)//false
console.log(null==undefined)//true
例2
console.log([]=='');//true
console.log([]==0);//true
console.log({}=='');//false
console.log([]==![]);//true
[]==''的对比过程:首先由于[]是对象类型,所以需要先转成原始类型,变成'',所以[]==''等价于''=='',返回true
再如,[]==0,[]先转成'',等价于''==0,现在''和0都是基本类型了,但是类型不同,所以转成数字类型在进行比较,''转成数字比较,结果转成0,所以最后等价于0==0,返回true。其他过程都是类似。
!=和!==
跟上面情况相反
逻辑运算
需要转为boolean,再运算
- x&&y
x为false,返回x。x为true,返回y
- x || y
x为false,返回y。x为true,返回x
例
console.log(1 || 2);//1
console.log(0 || 2);//2
console.log(0 && 1);//0
console.log(1 && 2);//2
上面都会对两端的进行Boolean转换,然后再判断,例如1转成true,0转成false