这道题是本人在面试一家公司时的一个简单的基础问题,公司就不透露了,算是国内颇有名的公司,本人面试的只是实习岗位。一些大的问题就再也不说了,每一个人遇到的可能都是不同的,基本会围绕着咱们日常所经常使用的东西来聊,下面就说一道小题:面试
写出下面几个表达式的结果:spa
NaN == NaN [] == false !![] == false {} == false undefined == null
这道题我估计不少人都会答错,本人就答错了,下面就来分析分析:翻译
NaN == NaN
3d
这个只须要理解NaN
是什么就好,NaN
表明的是Not a Number
,表明的是一个不能够表示的值,而非一个具体的值,因此NaN
和NaN
并不相等。code
==
比较的仅仅是值,而值+类型,因此==
会发生隐式的类型转换,因此有必要先来看一下ECMA
规范:blog
上图是规范,下面我就来翻译下上面说的:ip
undefined == null => true
字符串
Number
类型与String
类型比较的话,那么会对String
类型进行类型转换。get
假如含有Boolean
类型的话,会先将Boolean
类型转化为Number
类型。it
假如是基本类型与引用类型比较的话,会先尝试对引用类型进行转化。
了解了这部分规范后,就能够解决undefined == null
啦,根据规范会返回true
。
对于引用类型的转化,又有以下规则:
简单来讲就是有两种处理方式:
假如obj instanceof String
为true
,则会优先调用toString
假如不是String
类型,则会优先调用valueOf
方法
下面来继续看上面的题目:
[] == false // true
[]
会首先尝试调用valueOf
方法,[].valueOf()
返回是[]
,再调用toString
方法,[].toString()
返回的是空字符串,则比较的是'' == false
,依据规范进行转化:
'' == Number(false) => '' == 0 Number('') == 0 => 0 == 0
对于{} == false
来讲也是相同的道理,将其转化为[object Object] == false
,答案也很明了,返回的确定是false
。
再来看!![] == false
,首先来看一运算符的优先级,连接中的表格写出了各类运算符的优先级,根据表格能够知道的就是!
的优先级高于==
,而!!
将表达式转化为Boolean
类型,!![]
返回的是true
,因此!![] == false
值为false