致謝
首先說一下,其他數據類型轉換為布爾類型的規則: null、undefined、0、NaN、空字符串轉換為false,其他轉化為 true。
1. 取反 !
首先把數據轉化為布爾值,然后取反,結果為 true 或 false。
<script type="text/javascript"> var a = [1,2,3]; var b = "hello"; var obj = new Object(); var d; console.log(!""); //true console.log(!d); //true console.log(!a); //false console.log(!b); //false console.log(!obj); //false </script>
2. 邏輯與 &&
JavaScript 中邏輯與和其他語言不太一樣,如果第一個操作數是 true(或者能夠轉為 true),計算結果就是第二個操作數,如果第一個操作數是 false,結果就是 false(短路計算),對於一些特殊數值不遵循以上規則。(個人理解為:如果運算的第一個操作數為true,則返回第二個操作數,反之則返回第一個操作數)
<script type="text/javascript"> var a = [1,2,3]; var b = "hello"; var obj = new Object(); var d; console.log(true && 10); //第一個操作數是true,結果是第二個操作,也就是10 console.log(false && b); //第一個操作數是false,結果flase console.log(100 && false); //第一個操作數是100,結果flase console.log(undefined && false); //第一個操作數是undefined,結果undefined console.log(NaN && false); //第一個操作數是NaN,結果NaN console.log(null && false); //第一個操作數是null,結果null console.log('' && false); //第一個操作數是空串,結果空串 console.log(0 && 100); //結果是0 console.log(5 && 100); //100 console.log(a && b); //hello console.log(obj && 200); //200 </script>
3. 邏輯或 ||
如果第一個操作數不是 false,結果就是第一個操作數,否則結果是第二個操作數。如果第一個操作數能夠轉為 true,結果就是第一個操作數(個人理解為:如果運算的第一個操作數為 true,則返回第一個操作數,反之則返回第二個操作數)
<script type="text/javascript"> var a = [1,2,3]; var b = "hello"; var obj = new Object(); var d; console.log(true || 10); //第一個操作數是true,結果是第一個操作,也就是true console.log(false || b); //第一個操作數是false,結果是第二個操作數b console.log(100 || false); //第一個操作數是100,結果100 console.log(undefined || 9); //第一個操作數是undefined轉false,結果9 console.log(NaN || false); //第一個操作數是NaN轉false,結果第二個操作數 console.log(null || a); //第一個操作數是null轉false,結果a console.log('' || false); //第一個操作數是空串轉false,結果第二操作數 console.log(0 || 100); //結果是100 console.log(5 || 100); //5 console.log(a || b); //a console.log(obj || 200); //obj </script>
這種寫法非常常見,有利於提高代碼的健壯性,例子如下:
const jobIds = row.jobId || this.ids;
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']