JavaScript 面试题 == 和 === 的区别

346 阅读2分钟

JavaScript 面试题 == 和 === 的区别

前言

===== 在js里面非常常见,一般我们会在判断里面使用它们。== 运算符宽容度比 === 要高,会做一些隐式转换,因此在做条件判断的时候,我们绝大多数情况会使用 === 而不是 ==

区别

== 比较运算符在js里面功能比较强大,情况比较多变,当两边的数据类型不一致时会产生好几种不同形式的变化。

如果是基本数据类型类型之间的比较,会转换成数值类型进行比较,如果是存在引用类型,会先将引用类型转换原始类型,然后再进行比较。这里就涉及到另外两个函数toStringvalueOf

//JS基本数据类型分别有 Number、String、Boolean、Null、 Undefined、Symbol(ES6)
console.log(2=='2') //true
console.log(2=="2") //true
let a = '2'
console.log(2==a) //true
let b = ['2'] 
console.log(2==b) //true
console.log(0==undefined)//false
console.log(0==null)//false
console.log(null==undefined)//false

console.log(''=='0')           // false
console.log(0=='' )            // true
console.log(0=='0' )           // true
console.log(false=='false'  )  // false
console.log(false==undefined ) // false
console.log(false=='0'  )      // true
console.log(false==null )// false
console.log(null==undefined)   // true
console.log(' \t\r\n'==0  )   // true
console.log(undefined == null)//true
console.log(false == " \t     ")//true
console.log("" == 0)//true
console.log(123 == "123")//true
console.log("1" == true)//true

=== 比较运算符相比较== 运算符,不会做隐式转换,也就是不会自动调用toString valueof 方法。他会首先判断类型是否一致,然后在做比较。

console.log(2==='2')//false
console.log(2==="2")//false
let a = '2'
console.log(2===a)//false
let b = ['2']
console.log(2===b)//false
console.log(0===undefined)//false
console.log(0===null)//false
console.log(undefined===null)//false
// 在如下情况中,===的可靠性会比==要高
var obj = undefined;
if(obj == null){
console.log("1");  //执行
}
if(obj === null){
console.log("2");  //不执行
}

== 依赖的是toStringvalueOf 两个方法,可以通过修改prototype 来修改这两个方法,因此== 确实存在一定的不可靠性,从工程化角度上来说需要的是一个确定的结果,因此=== 可靠性更高一些。

几个面试题

'false' == false
NaN == NaN
NaN == false
NaN == true
NaN === false