iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
0
自我挑戰組

前端菜焦阿日記系列 第 21

|D21| JS - 你所不知道的 JS:型別與文法篇 隱含的強制轉型(implicit coercion)

  • 分享至 

  • xImage
  •  
tags: 2019年鐵人賽JSYouDon'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.

作者認為隱含的強制轉型最主要是為了減少冗贅。

Strings <--> Numbers

+ 運算子隱含的強制轉換

摘自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.

  1. 使用+運算子,其中一個運算元是 String,結果會是 String 的串接,所以將另一運算元做 toString() 的動作。
var a = 42;
var b = "0";
a + b; // "420"

var c = "";
var d = 35;
c + d; // "35"
  1. 使用+運算子,運算元是 object (包含 array),結果會是 String 的串接,object 會先進行 ValueOf() 動作,若 ValueOf()無法產生 primitive,會改使用 toString()
var a = [1,2];
var b = [3,4];
a + b; // "1,23,4" ,a 跟 b 做了toString()動作

- * / 運算子隱含的強制轉換

  1. 使用-運算子,其中一個運算元是 String,結果會是 Number 的- * /運算,所以將另一運算元轉為 number。
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
  1. 使用-運算子,運算元是 object (包含 array),object 會先進行 toString() 動作,再轉為 number。
var a = [4];
var b = [3];
a - b; // 1 

Booleans <--> Numbers

與 number 做運算,Booleans 會轉為 number

var a = true;
var b = 1;
a - b; // 0

* --> Boolean

有五種情況會將不是 boolean 的值都轉為 Boolean

  1. if(..)
  2. for( .. ; .. ; .. ) 中間的子句。
  3. while(..) do.. while(..)
  4. 三元運算子 ? : ; 第一個子句(問號前面)。
  5. || 和 && 左邊的運算元。

運算子 || 與 && ( or 與 and )

|| 與 && 會回傳運算元其中一個的值

  1. x || y
    x 是 true,|| 運算子的結果會是 x 值
    x 是 false,|| 運算子的結果會是 y 值

  2. 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)的相等性』

正確的描述是:「== 允許在比較中強制轉型,=== 不允許強制轉型。」

== 寬鬆相等的隱含強制轉型

== 兩邊怎麼做強制轉型的動作

例外情況

  1. 其他與 NaN 相比永遠都不相等,包括自己
  2. +0 與 -0 彼此相等

以下情況會先ToNumber(),再做比較

  1. 比較字串與數字
var a = 23;
var b = "23"
a == b; //true
  1. 比較布林與其他值
var a = "23";
var b = true;
a == b; //false

比較 null 與 undefined

只有兩種情況會是 true,其他都是false

  1. x 是 null,y 是 undefined,回傳 true
  2. x 是 undefined,y 是 null,回傳 true
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

上一篇
|D20| JS - 你所不知道的JS:型別與文法篇5 value
下一篇
|D22| JS - 用 JS 產生 HTML Tag
系列文
前端菜焦阿日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言