如果面试官给你出了一道这样的题:
console.log([] == false)
console.log(![] == false)
面对这样的问题,我们不仅需要准确的输出答案,还要知道它底层触发的是什么原理
其实,这个面试题触发的就是数据类型转换。
先不着急得到答案,我们先看看数据类型的转换机制
数据类型转换,无非只有三种:
第一:其他类型转换成Number类型
- 显示转换:特定需要转换为Number的
-
Number([val])
-
parseInt/parseFloat([val])
- 隐式转换(浏览器内部默认需要转换为Number在进行计算的)
-
isNaN([val])
- 数学运算 +,-,*,/,% (特殊情况,"+" 在出现字符串的情况下,不是数学运算,是字符串拼接)
- 在==比较的时候,有些值需要转换为数字在进行比较
第二:其他类型转换成字符串
- 能使用的办法
- toString()
- String()
- 隐式转换(一般都是调用toString)
- 加号运算的时候,如果某一边出现字符串,则是字符串拼接
- 把对象转换为数字,需要先toString()转换为字符串,再去转换为数字
- 基于alert/confirm/prompt/document.write…这些方式输出内容,都是把内容转换为字符串,然后在输出
第三:其他类型转换成布尔
- 基于以下方式可以把其他数据类型转换成布尔
- !转换为布尔值后取反
- !! 转换为布尔类型
- boolean([val])
- 隐式转换
- 在循环或者条件判断中,条件处理的结果就是布尔类型值
只有0,NaN, null, undefined 空字符串 5个值变成布尔类型为false,其他变成布尔类型都为true
现在我们来看一下这个题:
console.log([] == false)
分析:
- 对象和布尔比较; 都需要转换成数字
- 对象转换成数字,先toString转换为字符串,在转换为数字
转换:
- [] -> “” -> 0
- false -> 0
综上所述:
console.log([] == false) // true
第二题:
console.log(![] == false)
分析:
- 数组转换布尔类型
- 然后与 布尔比较
转换:
- [] 转换成布尔类型 为true
- ![] 则为false
- false == false ?
console.log(![] == false) // true
其实我们常常遇到的还是把其他类型转换为number类型
把其他类型转换为数字 Number 机制:
- 只要出现非有效数字字符,结果就是NaN
console.log(Number("10px") // NaN
console.log(Number(null) // 0
console.log(Number(undefined) // NaN
console.log(Number(Symbol(10))) // 报错
- parseInt 与parseFloat 机制
从字符串左侧第一个字符开始,查找有效数字字符; 把转换的值先转换成字符串(遇到非有效数字字符,停止查找,);把找到的有效数字字符转化为数字,如果没找到有效数字,则为NaN;
parseInt("") // NaN
Number("") // 0
isNaN("") // false
parseInt(null) //NaN
Number(null) // 0
isNaN(null) // false
parseInt("12px");//12
Number("12px") //NaN
isNaN("12px")// true
parseFloat("1.6px") + parseInt("1.2px")+typeof parseInt(null) // "2.6number"
isNaN(Number(!!Number(parseInt("0.8")))) //false
typeof !parseInt(null) + !isNaN(null) // "boolentrue"
- 面试题
let result = 10+false + undefined + [] + "Tencent" + null + true + {}
console.log(result)
大家可以把答案写在评论区