在开讲之前,首先让你们看看下面这个表达式返回的是什么结果
[]?!![]:![]
在看到这道题的时候你是不是在想wtf,我看到这道题的时候也是。没想到这道题这么灵活,考的是类型转换。。。如果一看就知道这道题的答案是true,那么这篇文章你可以不用看了,因为你已经了解了js的类型转换了。如果不知道为什么输出的是true,请看下面。
在js中,有哪些东西是false呢?常见的false值有如下这几个:空字符串、0、undefined、null、NaN和false,而对象即使是一个空对象它的值也是真的,那为什么像下面那样返回的结果是真的呢?
var a = []
a == false
原因是在于这个空对象在与false进行比较的时候,任意值与布尔值比较都会将两边的值转换成Number,因为a是空数组,所以转换成0,false也是转换成0。不过,如果把a数组强制转换成boolean,则是真值。所以如果想要输出的是false,则要这样子做:
var a = []
Boolean(a) == false
这样子返回的结果就是true值呢。所以我现在来解释一下一开始那条语句为什么输出的是true。不管是!!还是!,都是将数组转换成布尔类型,对象本来就是true,两个!!还是true,而一个!是false,所以最后面输出的结果是true。
在js中,类似的类型转换的例子数不胜数,有一些是显式转换的,如parseInt()、parseFloat()、利用构造函数(Number、String、Boolean等)、toString(),有一些是隐式转换的,除上面说的之外还有字符串与数字运算、字符串与布尔值运算、数字与布尔值运算等等。首先先要明确一点是,在加号运算符中,如果两个值一个是字符串一个非字符串,连接的优先级比相加的优先级高。如:
console.log('1'+2)
这个结果是一个字符串类型,返回12,
同理下面这个返回的一个字符串,结果是1true
'1'+true
而下面这个返回的是0因为布尔值被转换成数字类型:
'1' - true
关于类型转换这个坑还很深,很多时候不知不觉的就隐式转换了,现在先留一部分坑,留待以后发现了就继续填补。
最后留一个问题给大家思考,下面代码输出的是什么?这个也是类型转换。
var a = [,,,,]
console.log(a.join(','))
如果你说输出的是undefined,undefined,undefined,undefined,看来你的基础不错,知道这个是稀疏数组,该数组长度为4,未赋值的元素默认值为undefined,但是却是错的答案。正确的答案是输出三个逗号。这是因为join将数组内的内容当做字符串来输出,那既然是把数组内的内容当做字符串输出,数组里的元素默认为undefined,那为何输出的是三个逗号而不是undefined,undefined,undefined,undefined呢?这个也是我也在思考的,希望有人能够解出这个问题。
参考链接:博客园