iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
Modern Web

想轉職的鯊魚從零基礎開始學習JavaScript系列 第 9

想轉職的鯊魚從零基礎開始學習JavaScript Day-09 expression(運算式)與operator(運算子)

  • 分享至 

  • xImage
  •  

expression(運算式)

什麼是運算式,依據MDN-Expressions and operators的說法:

An expression is a valid unit of code that resolves to a value. There are two types of expressions: those that have side effects (such as assigning values) and those that purely evaluate.

能有效解釋的程式碼就是運算式,運算式有兩種展現形式:

  • 有函數副作用
  • 純粹的求數值

純粹的求數值很好懂就是一個計算的數學算式,可以回應出他的值

像是輸入8+7 就可以得到這個計算的結果17

8+9
//17

那什麼式函數副作用呢?

依據wiki-Side_effect_(computer_science)的說法

Referential transparency means that an expression (such as a function call) can be replaced with its value.

可以在呼叫的同時去改變它的值

這樣說或許還不是很懂,如果用程式碼來說明會像這樣

let a = "shark"

我們先宣告一個變數a並賦予他一個值(字串shark)

a 
// "shark"

呼叫a的時候,會回傳a的值(shark)

a = "shark-BLÅHAJ"
// "shark-BLÅHAJ"

但你也能在呼叫a的同時,去修改a的值(shark-BLÅHAJ),像上面那樣。

就種行為被成為side effects(函數副作用)。

函式的基本種類依據ECMAScript Language: Expressions可以分為三種

  • Primary Expression(基本運算式)
    最簡單的運算式,裡面不會在有其他運算式,較常出現constant(常數)、literal(文字)、某些語言的關鍵字以及variable references(變數的參考)
8
// 8 常數8
null
// null 文字null
this
// Window {window: Window, self: Window, document: document, name: '', location: Location, …}
// this關鍵字可以參考執行函數的所在位置(某些語言的關鍵字)
let a = "shark"
a
// "shark"
// 呼叫變數 a 可以得到 a的值 (variable references)
  • Left-Hand-Side Expressions(左手邊運算式)
    左側值為賦值的目標
let a = "shark"
// 將a進行賦值
  • Update Expressions(更新運算式)
    這是一個有著裡史脈絡的表達式跟Increment and decrement(遞增與遞減)的用法一樣。

operator(運算子)

什麼是運算子,依據MDN-Expressions and operators的說法:

All complex expressions are joined by operators, such as = and +.

連接所有複雜運算式的東西,皆為運算子,像是"="或"+"

運算子的種類很多

  • Assignment operators(指派運算子)
    也就是= 等號
let a ="shark"
// 將"shark"這個值(字串)指派給a,也就是我們常說的賦值
  • Comparison operators(比較運算子)
    strict equality(===) 嚴格等於
    Strict not equal (!==) 嚴格不等於
    loose equality(==) 不完全等於,經過自動轉型後為等於的結果
    Not equal (!=) 不完全不等於
    Object.is() 同值相等,用來判斷兩個值是否相等(不會自動轉型,判斷0跟NaN的方式跟loose equality有些出入)
    Greater than (>) 大於
    Greater than or equal (>=) 大於或等於
    Less than (<) 小於
    Less than or equal (<=) 小於或等於
2 == "2"
// true 經過轉型所以是true
2 === "2"
// false 經過轉型所以是false
Object.is(+0,-0)
// false 0的判斷跟===不一樣
//
  • Arithmetic operators(算數運算子)
    基礎的四個運算+-*/及計算餘數的%和指數的**
5%2
// 1 得5除以2的餘數1
2**2
// 4 2的2次方
  • Bitwise operators(位元運算子)
    將對象轉換成32位元,將其0與1值互換,符號為"~"
const a = 5;     
// 00000000000000000000000000000101 32為位元長這樣
console.log(~a); 
// 11111111111111111111111111111010 0與1值互換之後再轉回數字
// -6 轉回數字得到6
  • Logical operators(邏輯運算子)
    這系列有三個分別為AND"&&"、OR"||"及NOT"!"
    AND"&&"前後連結Bolean值(布林值)的結果,當前後均是true,才會回傳true否則為false
    OR"||"前後連結Bolean值(布林值)的結果,當前後有一個是true就會回傳true,前後為false則回傳false
    NOT"!"將true跟false的結果反轉
2 == 2 && 3 == 3
// true 當判斷結果均為true才會回傳true
// 後面直接用true跟false來替代判斷式
true || false
false || true
// true OR只要有一個是true就會回傳true
false || false
// false 都是false則回傳false
!true
//false 將true的結果反轉
  • BigInt operators(大數運算子)
    運算BigInt大數在用的,基礎的計算都一樣
    除了unsigned right shift (>>>),因為沒有32位元所以使用上跟一般的數字不一樣
  • String operators(運算子)
    將兩個字符串值用+連接在一起
"shark" + " BLÅHAJ"
// "shark BLÅHAJ"
  • Conditional (ternary) operator(三元運算子)
    condition ? val1 : val2
    依照condition判斷結果的布林值決定要回傳的值
    true回傳val1,false回傳val2
true ? "shark" : "BLÅHAJ"
// 因為condition判斷為true所以回傳"shark"
false ? "shark" : "BLÅHAJ"
// 因為condition判斷為false所以回傳"BLÅHAJ"
  • Comma operator(逗號運算子)
    計算其兩個操作數並返回最後一個操作數的值。
    主要用於 for 迴圈同時使用兩個參數的時候,
    在別處使用它被認為是不好的風格。通常可以而且應該使用兩個單獨的語句來代替。
for (let i = 0, j = 5; i <= j; i++, j--){
  console.log(i,j)
};
// 0 5
// 1 4
// 2 3
// 在for 迴圈同時使用兩個參數
  • Unary operators(一元運算子)
    一個運算式的只有一個運算子。
    像是 delete、typeof及void
typeof true
// boolean 上面只有一個運算子typeof
  • Relational operators(關係運算子)
    目的在測定兩個值關係,使用的運算子為in跟insranceof
let oceans = {shark:"BLÅHAJ"}
"shark" in oceans 
//true 因為物件oceans裡面有"shark",所以回傳true

鯊語錄

參考資料

wiki-Side_effect_(computer_science)
MDN-Expressions and operators
ECMAScript Language: Expressions
MDN-in operator


上一篇
想轉職的鯊魚從零基礎開始學習JavaScript Day-08 Object types 與 Gobal object
下一篇
想轉職的鯊魚從零基礎開始學習JavaScript Day-10 ECMAScript Language-概述(一)
系列文
想轉職的鯊魚從零基礎開始學習JavaScript31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言