寫JS時不可避免要用到 if 與 邏輯運算符( ||, &&)。
如果你經常閱讀Js的第三方組件源碼, 會發現有一種寫法作為初始化變量的方法經常出現。
var variable = variable || {};
我第一次看到這樣的代碼時覺得很不可思議,在多數主流語言下(如Java,C#,C/C++)上面得到的結果值毫無疑問會是一個布爾值,且始終為true。
在看看另一句我們自己寫時也常使用的
if( variable ){ somethingToDo(); }
雖然用得順手,可是你真的知道哪些值可以觸發 If 而哪些是不可以的嗎?
還有順帶的一提的是比較運算符,不過這里只說說"=="和"==="。
鑒於以上問題,於是上MDN上看了一些相關資料,順帶作下筆記。
首先來看一張表 :
Operator | Usage | Description |
Logical AND (&& ) |
expr1&&expr2 | Returns expr1 if it can be converted to false ; otherwise, returns expr2 . Thus, when used with Boolean values, && returns true if both operands are true; otherwise, returns false . |
Logical OR (|| ) |
expr1||expr2 | Returns expr1 if it can be converted to true ; otherwise, returns expr2 . Thus, when used with Boolean values, || returns true if either operand is true . |
Logical NOT (! ) |
!expr | Returns false if its single operand can be converted to true ; otherwise, returnstrue . |
圖就不翻譯了,相信不難看懂,可以看出除了非運算符(!),其余兩者都可能返回expr。
在MDN注明了,如果expr為非布爾值的話,它們也是會被原封不動地返回的,這與java或者c#的邏輯運算符是不同的。
在看來下什么情況下可以被轉為false(MDN值提供了可以被轉為false的值,也就是說其余的都是true)
他們包括
null
;NaN;
0
;(這是數字的0)- 空字符串(
""
); undefined
.
知道了這些之后,剛才的第一段代碼就很好理解了。也就是說,在 variable 為以上五種情況時會初始化為{}。
而第二段的 if 也很清楚地知道了它的判斷情況。隨便附上一句MDN關於if的解釋(原文點我)。
The if statement executes a statement if a specified condition is truthy. If the condition is falsy, another statement can be executed.
(如果condition是truhy[這是js定義的一種狀態]的,那么statement1會被執行,否則其他statemen會被執行)
示例代碼如下:
if (condition) statement1 [else statement2]
而關於truthy和falsy的定義在這個邏輯運算符的介紹頁面(原文點這)。
If a value can be converted to
true
, the value is so-called truthy. If a value can be converted tofalse
, the value is so-called falsy.
(如果一個值可以轉化為true那么稱呼它為truthy,如果一個值可以轉為false那么稱呼為falsy)。
接下來關於嚴格等於符[strcit equality](===)和類型轉化等於符[type-converting equality](==)。
從名字就看出來了,后者在比較時會執行隱式的類型轉化在比較,而前者不會。
MDN列出了幾點值得注意的地方(原文點我):
- 嚴格比較時兩個字符串必須在字符順序,字符,長度都相等時才會相等。
- 嚴格比較時兩個數字必須要擁有相同的數值大小。NaN不等於任何值,包括自己。 正負零沒有區分。
- 布爾值嚴格比較,只有當兩者都是true或false時才相同.
- 兩個不重復的對象無論使用===或者==都不可能相等。
- 當表達式比較的是對象時,只有它們的引用是來自同一個對象時才會為true.
- null和undefine嚴格相等比較時,只等於自身,而抽象比較(==)時相等。
以上。
這幾點都是我們在寫Js時常用的,如果沒徹底理解的話,恐怕會出一些不可思議的錯誤(笑),所以作下筆記,方便大家與自己都可以參考。