iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 10
0

運算子是一個特殊的函數
但它和其他你自己寫的函數不同
一般來說,運算子需要兩個參數來回傳一個結果
讓我們看看例子

var a = 3 + 4;
console.log(a);

我宣告一個變數 a
令它等於3 + 4
然後在 Console 顯示
現在執行
我打賭你一定猜得到它會顯示什麼
你猜對了
3+4=7

但你可能會有個疑問
JavaScript 是怎樣處理的?
它怎麼知道我要把3和4相加?
語法解析器看到加號後
就會把兩個數字加起來
加號就是運算子
這是加法運算子,它是一個函數

如以下範例程式碼,
宣告一個函數,但不是命名它為 add

function add(a, b) {
  
}

而是直接用加號代替

function +(a, b) {
  return a+b; // add the two
}

給定兩個參數,然後回傳一個值
將兩數相加
這就是 JavaScript 在處理運算子時所做的事
和你平常呼叫函數是不同的

如果這是一個函數,我會先給他刮號,然後傳入3和4,再呼叫它

+(3, 4);

但這樣做很麻煩,你要慢慢打出函數名字
而不能直接寫個加號

因此, JavaScript 就像很多其他程式語言一樣
你只需要利用中綴表示法就好
中綴表示法的意思是, 將你的函數名稱寫在兩個參數中間

3 + 4;

所以我們不是「加號、3、4」這樣呼叫函數

+(3, 4);

而是去掉刮號和逗號

+3 4;

這就是前綴表示法

我可以把加號放在最後面

3 4+;

這是後綴表示法 很多老式的計算機都是這樣運作的

然而, JavaScript 是用中綴表示法
讓人讀起來簡單易懂
但它的本質就是 一個具有兩個參數的函數
而這個函數會回傳一個值
這個回傳值, 以此加法運算子為例
就是將兩個參數相加
所以,加號是一個運算子
還有其他運算子
其他常見的還有減號, 讓我改成減號

var a = 4 - 3;
console.log(a);

列出這個值
會得到什麼

很簡單,1
因為減號是一個運算子

如果我問個問題
4大於3,這也是一個特別的函數

var a = 4 > 3;
console.log(a);

大於是一個函數,大於符號是個運算子

這和上述運算子不同,它需要兩個參數, 然後回傳布林值
這是一種剛剛討論的純值
如果左邊的值大於右邊的值

它會回傳 true
反之則回傳 false
我重新整理網頁,對,4大於3
所以這個函數需要兩個參數,回傳布林值

這就是你需要記住的觀念
就是當我們輸入這些運算子,像是 加號、減號、小於、大於或其他許多運算子時,
它們其實是特殊的函數而已
這些參數被傳入那些函數中
然後回傳一個值
在這些函數裡,他已經幫你寫好了一些程式碼
JavaScript 讓你利用這些運算子呼叫函數
而這些背後的處理你必須要瞭解
特別是對於 JavaScript 這種動態型別的程式語言
你並不需要在執行前瞭解
所有變數的型別
JavaScript 會這樣幫你處理
所以現在你必須記住,運算子也是一種函數

運算子的優先性與相依性

在同一行程式有不只一個運算子時,運算子(函數)會依序運算,具有高優先性的運算子會先計算,如果優先性相同則要看相依性,相依性有分左相依性和右相依性,相依性用來判斷是從左到右運算還是從右到左。

來看個例子:

var a = 3 + 4 * 5;
console.log(a);

因為*運算子的優先性較+運算子高,所以會先返回 4 * 5的值後再將 3 + 20,在 Console 的結果為23。

等號也是運算子,
來看個例子

var a = 2, b = 3, c = 4;
a = b = c;
console.log(a);

優先性相同就必須從相依性來判斷執行順序,=運算子是右相依性,會將 b 的值設定為 c 的值,現在 b 的值為4,運算完再將返回值與左邊的運算子與參數做運算,會將 a 的值設為 b 的值(現在為4),在 Console 中會得到 的值為4。

var a = (3 + 4) * 5;
console.log(a);

()群組運算子的優先性最高,會先將括號裡的運算子的運算內容執行運算完才會繼續執行其他運算子的計算。

優先性與相依性的詳細資訊可參考此連結

強制型轉(coercion)

強制轉型: 轉換一個值的型別,因為 JavaScript 是動態型別,所以只有在執行時才會知道型別,
我們來看個例子:

var a = 1 + ‘2’;
consolo.log(a); //輸出 12

上面的變數a輸出後得到12是因為 JavaScript 看到後面有字串,+運算子(函數)執行時它會自動將參數 1 (Number)型別強制轉型為字串型別,強制轉型是 JavaScript 這種動態型別程式語言的特性,在 JavaScript 中要特別留意這種特性。


上一篇
Day 9 JavaScript 型別裡的純值
下一篇
Day 11 比較運算子
系列文
教練我想學 JavaScript 30

尚未有邦友留言

立即登入留言