js运算规则

78 阅读2分钟

算数运算

首先都转成原始类型,然后查看下面三条规则

  • 类型不同,转成数字,然后运算
  • (特殊)两个运算中有一个是字符串,进行字符串拼接
  • (特殊)有一个是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