1

写在前面

这道题是本人在面试一家公司时的一个简单的基础问题,公司就不透露了,算是国内很有名的公司,本人面试的只是实习岗位。一些大的问题就不再说了,每个人遇到的可能都是不一样的,基本会围绕着我们平常所常用的东西来聊,下面就说一道小题:

题目

写出下面几个表达式的结果:

NaN == NaN
[] == false
!![] == false
{} == false
undefined == null

这道题我估计很多人都会答错,本人就答错了,下面就来分析分析:

  • NaN == NaN

这个只需要理解NaN是什么就好,NaN代表的是Not a Number,代表的是一个不可以表示的值,而非一个具体的值,所以NaNNaN并不相等。

==比较的仅仅是值,而值+类型,所以==会发生隐式的类型转换,所以有必要先来看一下ECMA规范:

clipboard.png

上图是规范,下面我就来翻译下上面说的:

  • undefined == null => true

  • Number类型与String类型比较的话,那么会对String类型进行类型转换。

  • 假如含有Boolean类型的话,会先将Boolean类型转化为Number类型。

  • 假如是基本类型与引用类型比较的话,会先尝试对引用类型进行转化。

了解了这部分规范后,就可以解决undefined == null啦,根据规范会返回true

对于引用类型的转化,又有如下规则:

clipboard.png

简单来说就是有两种处理方式:

  • 假如obj instanceof Stringtrue,则会优先调用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


zp1996
3.2k 声望65 粉丝

coder