這邊用這篇文章來做總結一下
會用一些範例幫大家複習觀念
var a = 1;
var b = new Number(1);
console.log(a == b); // true
console.log(a === b); // false
可以看到在 寬鬆相等 的時候型別會自己轉換,所以 建構式建構出來的 包裹物件 數字 1 是等同於 原始型別 的數字 1。
但 嚴格相等 的比較狀況下,就會將 建構式建構出來的 包裹物件 視為是物件,型別不相等因而回傳 false的結果。
console.log(1 || 0); // 1
使用邏輯運算子 ||
會回傳經過判斷為第一個為 truthy 的值,就回傳第一個值,否則就回傳第二個。
這邊依照這個概念判斷,1 為 truthy 就直接回傳 1 。
var a = 1;
var b = 2;
var c = 0;
console.log(a && b && c); // 0
使用邏輯運算子 &&
為二元運算子,一次只會處理左右兩個運算元,且其相依性為 左到右。
又,&&
會判斷第一個值為 falsy 會直接回傳,不然就回傳第二個的值,所以~ 這邊 a = 1 是 truthy, 他就直接回傳 b = 2。
接著表達式就變成 2 && 0 ,這時候一樣 2 是 truthy ,所以直接回傳 的結果。
如果上面的邏輯沒問題的話,再看看一樣用範例三的範例來進行說明:
console.log(c || c && c || a);
這邊同時有 &&
以及 ||
這兩個邏輯運算子,在優先度來說,&&
比 ||
還高,所以會先執行 c && c
,並且回傳結果為 0。 之後才進行 c || 0
的判斷結果, 因為第一個 c 是 falsy,所以回傳第二個值。
之後 0 || a
,很明顯 0 就是 falsy,所以回傳 a 的值,也就是 1。
console.log(c || 0 || a);
console.log(0 || a);
console.log(a); // 1
好,依照上面的邏輯,我們再來看一下這個練習題,也是延續範例三的變數設定喔
console.log(a && b || c && a);
這邊直接公布答案是 2。
大家可以自己推演看看喔。
var a = 1 + 1 === 1;
console.log(a); // false
這題很明顯就是在考優先序的部分,因為 +
的優先序大於 ===
,所以自然 2 === 1
會回傳 false。
console.log(1000 < 10000 < 10); // true
這邊就是考大家相依性的問題 <
的相依性是從左到右,並且是二元運算子。
所以她的比對流程會是
1000 < 10000 回傳 true
true < 10 型別轉換
Number(true) => 回傳 1
1 < 10 // ture
console.log(true);
所以結果就是true。
var a = '1';
var b = 2;
var c = (a > b) ? a * b : sum(a, b);
function sum (a, b) {
return a + b;
}
console.log(c); // '12'
這邊的邏輯首先先從 (a > b)
這個判斷開始看,在比對的時候雖然 a 是字串 1 ,但會被轉型為 數字 1,接著 1 > 2 會回傳 false,所以會執行 sum(a, b)。
而這個sum又會回傳依照傳入的 a , b進行處理。
又因為 字串'1' + 數字2 => 會轉型為字串'12'。
所以最後印出來的結果就是 '12'。
這個篇文章就用這六個範例幫大家複習第三章學習到的觀念跟知識,沒有問題的話就可以往下進行嚕~汪汪