写在前面
这道题是本人在面试一家公司时的一个简单的基础问题,公司就不透露了,算是国内很有名的公司,本人面试的只是实习岗位。一些大的问题就不再说了,每个人遇到的可能都是不一样的,基本会围绕着我们平常所常用的东西来聊,下面就说一道小题:
题目
写出下面几个表达式的结果:
NaN == NaN
[] == false
!![] == false
{} == false
undefined == null
这道题我估计很多人都会答错,本人就答错了,下面就来分析分析:
NaN == NaN
这个只需要理解NaN
是什么就好,NaN
代表的是Not a Number
,代表的是一个不可以表示的值,而非一个具体的值,所以NaN
和NaN
并不相等。
==
比较的仅仅是值,而值+类型,所以==
会发生隐式的类型转换,所以有必要先来看一下ECMA
规范:
上图是规范,下面我就来翻译下上面说的:
undefined == null => true
Number
类型与String
类型比较的话,那么会对String
类型进行类型转换。假如含有
Boolean
类型的话,会先将Boolean
类型转化为Number
类型。假如是基本类型与引用类型比较的话,会先尝试对引用类型进行转化。
了解了这部分规范后,就可以解决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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。