iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
自我挑戰組

追憶JS年華系列 第 8

Day 08 借箸代籌(2):自動轉型、運算子及其後

自動轉型

續前文所述,當我們使用兩個等號(==)作比較運算時,深受JavaScript「自動轉型」的干擾,結果難料。每當 == 兩端值的資料型態不同時,就會發生自動轉型。比如:

  • 若布林值(true或false)與數字相比較,布林值就會被「自動轉型」為數字。true變成1,false變成0。
  • 若字串(如”89”)與數字(如89)相比較,字串會被「自動轉型」為數字,再做「比較」。
  • 若「物件型別」(Object Type,如陣列、函式)與「基本型別」(Primitive Type,如null、undefined、number、字串、布林值、符號)相比較,前者會被「自動轉型」取得後者之值,再做「比較」。
  • 若兩個物件相比較,必須指向同一實體方為相等(取得true)。
  • NaN永遠不等於NaN自己。

除了等號比較,自動轉型的影響也及於大於(>)、小於(<)、大於等於(>=)、小於等於(<=)的比較。布林值的轉型與==相同。若其中一側不是數字,會被「自動轉型」為數字。若是「字串」與「字串」相比較,會以字母順序來決定大小。

指派運算子

人如其名,本運算子可用於值的指派,如最簡單的一個等號(將右邊的值指派給左邊的變數)

let kageBunshin = 10 * 10;

亦可結合數學運算:

let kageBunshin += 10; //即 影分身 = 影分身+10

逗號運算子

逗號(,)可以將同一運算式下的更多式子彼此隔開,也可以將兩行的宣告寫成一行。如:

let Nihonium = 113;
let Flerovium = 114;

可以寫為:

let Nihonium = 113, Flerovium = 114;

邏輯運算子

一般所指的邏輯判斷,是指「而且」、「或者」、「並非」的二元判斷,如:

  • AND(&&):當&&左右兩側的條件一樣(如:值皆為true)時,則得出true,否則為false。如:
100 === 100 && 1000 === 1000 //true
  • OR(||):當||左右兩側的條件,只要有一個吻合(如:值為true)時,則得出true。兩者皆非才是false。如:
100 === 100 || 1000 === 500 //true,因為左邊符合
  • NOT(!):將ture轉為false,反之亦然。連用!!可以判斷一個值的布林值。如:
!(10 > 100) //true,因為條件是「若false時為ture」

有關&&與||在邏輯運算中的具體關係,可參考表格如下:
https://ithelp.ithome.com.tw/upload/images/20211010/20141041zFefrUiEcJ.jpg

然而,若直接以一個if條件式帶入兩個變數/值作判斷,卻未必能得到預期中的true/false結果。原因是在JavaScript中,布林值(boolean)與數值(number)不會彼此相等,沒有其他語言中「true = 1」「false = 0」的性質(只經過強制轉型呈現類似情狀)。

易言之,JavaScript的「值」分為兩種:

  • 經由強制轉型(ToBoolean)後,得出false的值:Undefined、null、正負0或NaN、空字串(""或''包住的)
  • 經由強制轉型(ToBoolean)後,得出ture的值:除上述false外的其他所有。

有關更進階的資訊,建請以關鍵字「Truthy值」、「Falsy值」作深入研究。


上一篇
Day 07 借箸代籌(1):運算式、運算子
下一篇
Day 09 流程控制
系列文
追憶JS年華30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言