2019年鐵人賽
、 JS
、 YouDon'tKnowJS
摘自You-Dont-Know-JS
Let's define the goal of implicit coercion as: to reduce verbosity, boilerplate, and/or unnecessary implementation detail that clutters up our code with noise that distracts from the more important intent.
作者認為隱含的強制轉型最主要是為了減少冗贅。
摘自You-Dont-Know-JS
if either operand to + is a string (or becomes one with the above steps!), the operation will be string concatenation. Otherwise, it's always numeric addition.
var a = 42;
var b = "0";
a + b; // "420"
var c = "";
var d = 35;
c + d; // "35"
var a = [1,2];
var b = [3,4];
a + b; // "1,23,4" ,a 跟 b 做了toString()動作
var a = "305";
var b = a - 0;
b; // 305
var c = "42";
var d = c * 1;
d; // 42
var e = "44";
var f = e / 1;
d; // 42
var a = [4];
var b = [3];
a - b; // 1
與 number 做運算,Booleans 會轉為 number
var a = true;
var b = 1;
a - b; // 0
有五種情況會將不是 boolean 的值都轉為 Boolean
|| 與 && 會回傳運算元其中一個的值
x || y
x 是 true,|| 運算子的結果會是 x 值
x 是 false,|| 運算子的結果會是 y 值
x && y
x 是 true,&& 運算子的結果會是 y 值
x 是 false,&& 運算子的結果會是 x 值
var a = 42;
var b = "abc";
var c = null;
a || b; //42
c || b; //"abc"
a && b; //"abc"
c && b; //null
常見的誤解是『==檢查值(values)的相等性,===檢查值和型別(types)的相等性』
正確的描述是:「
==
允許在比較中強制轉型,===
不允許強制轉型。」
== 兩邊怎麼做強制轉型的動作
var a = 23;
var b = "23"
a == b; //true
var a = "23";
var b = true;
a == b; //false
只有兩種情況會是 true,其他都是false
var a = null;
var b;
a == b; //true
b == null; //true
a == false; //false
a == ""; //false
b == 0; //false
非物件指 string 、 number 、 boolean,當物件與非物件比較時,object 會先進行 ValueOf() 動作,若 ValueOf()無法產生 primitive,會改使用 toString()
var a = 24;
var b = [24];
a == b; // true