第七章的最後部分
四天弄下來,不管是 明確的、隱含的 還是相等性。
已經是處在被問不倒的狀態。
就算答錯,也能馬上意會,哪裡出問題。(阿不是問不倒?)
一句話回想四個部分的重點吧!
+
, -
, *
, /
, ~
, |
, parseInt(), !!
。&&
, ||
正確的描述是:「
==
允許在比較中強制轉型,===
不允許。」
所以,只要型別不同,===
肯定不相同。
效能只差百萬分之一秒。若想強制轉型兩邊,直接用 == 是沒問題的。
了解==
強制轉型兩側如何轉型。
先列出例外
x == y | x = "1" | x = 1 |
---|---|---|
y = "1" | true | ToNumber(y) |
y = 1 | ToNumber(x) | true |
hint: ToNumber(),先找 valueOf(),再找 toString()。
先 ToNumber( Boolean ),再與其他值比較。
所以,不要用 == true 和 == false。
他們只會被轉成 1 和 0,在和其他值比較。
(判斷真假值不是這樣用低!)
拿來判斷 null or undefined 最好不過。因為其他全都是 false。
x | y | |
---|---|---|
String or Number | {} | ToPrimitive(y) |
{} | String or Number | ToPrimitive(x) |
沒有 Boolean 是因為不管怎樣先轉他,得到 number。
"0" == null; // Rule 2
"0" == undefined; // Rule 2
"0" == false; // number == number
"0" == NaN; // NaN != anything
"0" == 0; // number == number
"0" == ""; // string != string
false == 0; // number == number
false == ""; // number == number
false == []; // number == number
false == {}; // number != "[object object]"
"" == 0; // number == number
"" == []; // number == number
"" == {}; // number != "[object object]"
[] == ![]; // number == number( from false )
2 == [2]; // number == number ( from string)
"" == [null];// "" == ""
0 == "\n"; // true 詳情看書。
在這兩種情況下請務必使用 ===
。
在這裡你可以了解所有的相等性。
大於 和 小於 兩側運算元比較的隱含轉型。
規格只定義了兩個部分。
然後,不管大小於,JavaScript 都是以小於來處理。 a > b
==> a < b
。
var a = [42];
var b = ["43"];
a < b ; // true
b < a ; // false
array 會先呼叫 ToPrimitive,然後只要其中一方不是 string,就會轉為 Number 值。
所以,只要兩邊轉型後,都是 string,就會以 逐字 比較。
var a = ["42"]
var b = ["043"]
a < b ; // false
讓我們看看 object 吧!
var a = { c: 42 };
var b = { c: 43 };
a < b ; // false
b < a ; // false
因為 物件經過隱含轉型後,會變成 "[object object]"。
但是!
a == b ; // false
這要了解前面說 ==
比較的對象是誰。
其實是 object 所指向的記憶體位置參考 (referance)。
但是!
a <= b; // true
a >= b; // true
對於 a >= b
來說,他是先估算 a < b
,再做否定。
(這邊真的是有點雷,如果不知道規則真的想破頭。)
小結:如果要在關係式比較上,更準確知道比較型別,先明確的強制轉型吧。當然,如果你很了他隱含的強制轉型,就不用理會了。
總之,規則很多,不管背不背的起來,就先測試,還是要用身體體驗呢?
祝 武運昌隆!
( 明天是週末了耶!!)