iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0
Modern Web

我的JavaScript日常系列 第 2

JavaScript Day 2. 關於,運算子們

JavaScript 有許多的運算子,在這裡就挑了幾個比較常見,卻又老是感到模糊的來研究。

賦值運算子

這邊為MDN歸納的簡單範例:

// 前面為賦值運算子的範例,後方為運算子的意義
x = y  // 賦值 x = y
x += y // 加法賦值 x = x + y
x -= y // 減法賦值 x = x - y
x *= y // 乘法賦值 x = x * y
x /= y // 除法賦值 x = x / y
x %= y // 餘數賦值 x = x % y
x **= y // 指數賦值 x = x ** y
x &= y // 位元 AND 賦值 x = x & y
x ^= y // 位元 XOR 賦值 x = x ^ y
x |= y // 位元 OR 賦值 x = x | y

// 以下是我比較少見到的賦值運算子
x <<= y // 左移賦值 x = x << y
x >>= y // 右移賦值 x = x >> y
x >>>= y // 無號右移賦值 x = x >>> y

以上範例程式碼,可以大概看出賦值運算子的規則,下面則是我自己實際操作某些運算子,看起來更淺顯易懂:

// 這裡是 =、+、+=、++、-- 的範例
let a = 1;
let b = 2;

a = 50;
a = a + 10;
a += 10;
// 總共是70

a += 10;
// 這裡是80

a ++;
a ++;
// 這裡是82

a --;
// 這裡變回81

console.log(a); // a = 81

對賦值運算子試著做一點延伸,不只可以在數字上運作,譬如讓數字相加、相減、賦值或是文字上都是可以執行的:

let doraemon = '無敵哆啦A夢總是照顧';
let nobita = '弱弱的大雄';

let totle = doraemon + '  ' + nobita; // 這個地方也可以預留空白
console.log(totle); // "無敵哆啦A夢總是照顧  弱弱的大雄"

比較運算子

比較運算子會比較運算元,然後回傳比較的結果,運算元可以是數字、字串、邏輯或物件的值,假如不同型別做比較,JavaScript 也會試著幫忙轉換型別,也有其他例子會使用較特殊的方式做比較,譬如使用 ===!== 運算子,用較嚴格的方式做相等或不相等的比較。

這邊幫助我自己查看,同樣也簡單把MDN上的簡單表格,與我自己的想法大致記錄一下

== // 等於,兩個運算元相等就回傳 true
!= // 不等於,兩個運算元不相等,並且會回傳 false
=== // 嚴格等於的比較,會比較也會看型別,但不幫忙轉型,就連型別一樣文字不同,也會回傳 false
!== // 嚴格不等於的比較,與上嚴格等於雷同,會較嚴格的比較不等於的運算元
> // 大於,左方大於右方運算元,回傳 true
< // 小於,左方小於右方運算元,回傳 true
>= // 大於或等於,左方運算元條件大於或等於右方運算元,回傳 true
<= // 小於或等於,左方運算元條件小於或等於右方運算元,回傳 true 

將上面實際的運行一遍,看看會有什麼樣的效果。

let a = 1;
let b = 2;
console.log(a == b); // false
console.log(a != b); // true

這個範例,我用了不同的型別去查看會有什麼變化。

// 這裡用了不同的型別
let c = 4;
let d = '4';
console.log(c == d); // true

可以看到不同的型別,結果仍然是 true,原因是因為兩個等於「==」的比較運算子,在遇到不同型別的運算元,會先轉為相同型別再做比較,因此結果會是 true

== 自動轉換型別的規則:

  • 如果其中一個是布林值(Boolean),在比較之前會先把他改成數值(Number)。
  • 如果其中一個是字串,另一個是數值,會通過 Number() 函式將字串轉為數值。
  • 如果是物件,另一個不是,就會呼叫物件的 valueOf() 方法,得到的結果並進行前面的方式作比較。
  • nullundefined 是相等的。
  • 如果其中一個值是 NaN,則相等比較返回 false
  • 如果都是物件,則比較是不是指向同一個物件。
let c = 4;
let d = '4';
console.log(c === d); // false
console.log(c !== d); // true

而三個嚴格等於 === 及嚴格不等於 !== 則可以看到,他們不會幫忙轉型,因此呈現上面結果

邏輯運算子

邏輯運算子通常用於布林值,需要判斷此條件為 truefalse 的情況。

&& // 必須同時符合兩種情況
|| // 兩種條件只要符合一個,即是 true
! // 假如單一個運算元能被轉換成 ture 時,回傳 false,不然回傳 true
	// 可以被轉換為 false 的運算式是 null, 0, NaN, 空字串 (""),或 未定義。

&& 語意上為「....和什麼」,故名思義必須符合兩種條件才會回傳 true。舉一個情境,大雄希望哆啦A夢可以給他三片以上的記憶吐司跟一杯水,這樣他才要把書拿出來。

let memoryToast = 4;
let water = true;
console.log(memoryToast>=3 && water==true); // true
console.log(memoryToast==3 && water==true); 
// 這邊只要有一個條件不成立,就會回傳 false

|| 語意上為「......或什麼」,因此只要條件中有一個符合便回傳 true,同樣以上面的範例改成 || ,也會看到原本 false 的結果變成 true

let memoryToast = 4;
let water = true;
console.log(memoryToast==3 || water==true); // true

! 語意上為「非、不」,通常用於布林值,需要它由 true 轉成 false,或相反的時候使用。

let a = 1;
let b = 2;
console.log(!(a==1 && a<b)); // false

可以看到 a==1 && a<b 在正常情況下是 true,但在前面加了 ! ,它的布林值被反轉了。

算數運算子

算數運算子的部分,有兩個較特殊的運算子,取餘數 % 和指數運算子 **, 這兩個目前在我的練習上不常見,但偶爾見到還是微錯愕了一下。

** 簡單來說就是某某次方的意思,但其實我不太確定什麼時候比較需要用到,但了解了解總是沒有壞處,以下呈現的數值是平方出來的結果,但其實我完全不知道到底有沒有算對(與數學絕緣的人)。

console.log(2 ** 4); // 16
console.log(8 ** 16); // 281474976710656

所以數學很好的大大們,你們覺得有算對嗎XD

取餘數,回傳的結果為兩個數值相除後的餘數,第一次看見這個運算子,是我練習使用 if 取奇數或取偶數的時候,當時還真不知道可以這樣用。

let thisNumber = 22;
// 除 2 取餘數判斷為奇數還是偶數
// 偶數餘 0
// 奇數餘 1
if(thisNumber % 2 == 0){
		console.log("偶數")
}else{
		console.log("奇數")
}

雖然到現在已經認識了很多的運算子,但其實知道仍有許多不熟悉的地方,常看到的就整理在這邊了,希望以後自己回來找答案,會感到輕鬆又方便^__^


上一篇
JavaScript Day 1. 基礎字串處理
下一篇
JavaScript Day 3. 變數:布林、undefined、null
系列文
我的JavaScript日常31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言