1、==
和===
的区别
==代表相同,===代表严格相同
使用==时,首先检查两个变量的数据类型,若相同,进行===判断,若不相同,则进行一次隐性类型转换,转换成相同类型后再进行===比较。
使用===时,引用类型的比较是比较其地址值,即引用的地址是否相同,若不同则为false
2、隐性类型转换规则
(1)若==两边存在NaN,直接返回false
(2)若==两边存在boolean类型的值,则转为Number类型(false转为0,true转为1)
(3)再看==两边有没有字符串:
a、如果两边都是字符串,直接比较,
b、如果一个是字符串一个是数字,则字符串转数字
c、对象使用toString或者valueOf方法转成字符串
(4)如果是数字,对方是对象,对象取valueOf()或者toString()进行比较, 其他一律返回false
(5)null, undefined不会进行类型转换, 但它们俩相等
简单来说,隐性转换规则如图:图片地址
3、几个实用的特殊的判断
(1)判断变量xx是不是undefined,使用 xx===undefined
(2)判断变量xx是不是null,使用 xx===null
(3)判断变量xx是不是null或者undefined,使用 xx==null或xx==undefined
(4)NaN与谁比较(无论是==还是===),都返回false
(5)判断变量xx是不是NaN,使用 isNaN(xx)
(6)if(NaN) if(undefined) if(null) if(0) if(''),都返回false
(7)判断变量xx是不是数组,使用 Array.isArray(xx)
(8)判断变量xx是不是对象(狭义上的对象,不包括数组和函数),这里给出两种方法:
第一种: xx instanceof Object&&!Array.isArray(xx)&&(typeof xx)!=="function"
第二种: Object.prototype.toString.call(xx) === '[object Object]'
(9)判断变量xx是不是函数,使用 typeof xx ==="function"