前端面试常见的坑之类型转换

        在开讲之前,首先让你们看看下面这个表达式返回的是什么结果

[]?!![]:![]
        在看到这道题的时候你是不是在想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呢?这个也是我也在思考的,希望有人能够解出这个问题。

参考链接:博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值