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語句時 根據自己實際需求和後臺返回差異性,注意一些這樣的問題也基本上能解決相應問題。