添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
老实的人字拖  ·  (VBA) 的 AppActivate ...·  1 年前    · 
绅士的洋葱  ·  javascript - In ...·  1 年前    · 
js中绕晕你的true、false

js中绕晕你的true、false


date: 2019-02-26 14:25:01

tags: js、类型转换、空数组、空对象、==


起因

大概从开始写前端代码一段时间后你就会遇到false判断的各种坑,层出不穷。为什么会有坑,又怎样避免这些坑? 下面,我们就得好好了解一下这些能转为false的值了。

结果

js的类型转换虽是繁琐的,但也是有迹可循的。首先我们来看一下能转化为false的值,见下表:


转数字 转字符串 转布尔值
undefined NaN “undefined” false
null 0 “null” false
false 0 “false” false
0、-0 0、-0 “0” false
NaN NaN “NaN” false
""、'' 0 ""、'' false

共6种,其余的值转化为布尔值时都是true。即这6种在判断X==flase为true,同样在if判断中会将值先转化为布尔值,因此这6种值在if或三目运算中为flase。

console.log(undefined ? true : false); //false
console.log(null ? true : false); //false
console.log(0 ? true : false); //false
console.log('0' ? true : false); //true
console.log('undefined' ? true : false); //true
console.log(([0]) ? true : false); //true [0]为object

而空对象{}、空数组[]直接放到if判断中都为true,因为数组属于对象类型,对象类型转为布尔类型(ToBoolean 算法)时都是true。但当判断[] == false时结果却是true。下面我们就来讨论一下关于“==”的问题。

进阶

上面提到空数组和空对象在if判断中为true,但

console.log([] == false ? true : false);//true
console.log({} == false ? true : false);//false

这又是为什么呢?原因就是“==”在进行判断前会对两边的操作值进行隐式转换。规则如下:

  • 一个值是null,另一个是undefined,则它们相等。
  • 一个值是数字,另一个是字符串,先将字符串调用Number()转换成数字,然后使用转换后的值进行比较。
  • 一个值为布尔值,则在比较之前先将其转换为数值。
  • 一个值是对象,另一个值是数字或字符串,则调用对象的valueOf()转换为原始值,然后再进行比较。
  • 两个值都是对象,则比较它们是不是指向同一个对象
  • 其他类型之间的比较均不相等。 上述表达式中,与flase比较前先将空对象 {} 与空数组 [] 转换为数值,即
Number([]) //0
Number({}) //NaN
Number(false) //0

因此,转化为

console.log([] == false ? true : false); => Number([]) == Number(false) => 0 == 0 => true