js的if语句,是把其他数据类型强制转为Boolean类型,其主要常见误区也就是对于js数据类型理解不够深入。首先说一下js的数据类型吧。
基本类型:字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol(独一无二[es6增加的])。
引用类型:对象(Object)、数组(Array)、函数(Function)。
基本类型直接存在栈内存中 引用类型的地址存在栈内存,内容存在堆内存中,这就牵扯到深拷贝可浅拷贝(浅拷贝只拷贝栈内存内容,对引用类型就会使得只使用了栈内存的地址)。扯远了。。。
今天主要说的是 if 语句把类型都强制转为Boolean类型的常见误区
一、通常会直接转为false的四种类型 (没有[] ,{}, function(){})
尤其是[] 和{} 这两个可以继续执行if里的语句的! 还有就是数字0 会被做终止操作。尤其是vue内的v-if操作很容易把0搞掉
1.数字0
2.NaN
3.空字符串
4.null或undefined
二、"0" "null" "undefined"则会返回true
js这种弱类型语言,赋值啥类型就改成啥类型了,后台规范了还好,要是不规范,心里一万个草泥马。同样的代码这边好着,那边又不行了。算了也不能全怪后台,还是做一下类型判断。
三、if([]==false) 返回true if({} == false) 返回false
妈蛋这是什么鬼 if([]) true if([] == false) true; 心里是不是又是一万个草泥马。
四、if([] == []) 为false if({} == {}) 也为false
至于三和四 原因是js == 运算符的处理问题
js做 == 操作 经历过程如下
[] == false 经历以下的转化过程
([] == false) ----> ([] === +0) ----> (“”== +0) ----> (+0 == +0) ---> true
也就经历了8 9 10 三个过程
因此判断数组和对象是否为空,常用length来判断
js鸭子型语言 是有很多弊端,在使用if语句时 根据自己实际需求和后台返回差异性,注意一些这样的问题也基本上能解决相应问题。