JavaScript Weird Part (16) - 運算子的優先性與相依性

了解運算子後,繼續了解運算子的優先性與相依性。這兩個概念沒有想像中的複雜。

運算子優先性

運算子優先性表示當一行程式碼裡面有多個運算子的時候,哪個運算子被優先運算,函數會依序運算。具有高優先性的運算子,會先計算,然後依序到低優先性的

運算子相依性

運算子相依性是和運算子優先性相關的概念,優先性表示運算子被計算的順序,當兩個運算子有相同的優先性,優先性能協助判斷誰先誰後。可是如果所有的運算子優先順序都相同呢?

這時就要看相依性,判斷是由左到右的「左相依性」,或者是由右到左的「右相依性」。

1
2
var a = 3 + 4 * 5;
consoloe.log(a);

在前面說明運算子的時候,可以知道運算子是被當成一種函式在處理。所以這個例子裡,需要處理兩個函式。我們知道四則運算裡先乘除後加減的原理,JS 也是這樣處理。

雖然 Javascript 是同步的(synchronous),但不會同時處理這兩個函式的呼叫。它只會先呼叫其中一個,再處理另一個。首先是用運算子的優先性判斷,優先性高的會先被呼叫。

https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

在 MDN 的優先性表格裡,數字越大的會優先被呼叫。所以乘法的優先性高於加法,此外,等號也是一種運算子。所以上面的範例會得出 a 的值等於 23。

但是如果像除法、乘法,都有一樣的優先性的時候,底層是怎樣判斷呢?

1
2
3
4
5
6
7
var a = 2,
b = 3,
c = 4;
a = b = c;
console.log(a);
console.log(b);
console.log(c);

照理來說,會顯示相等的值,但究竟會呈現什麼值呢?

為什麼結果都是 4 呢? 這是因為相依性 (associativity),這裡使用的運算子是等號,是用來傳入值的,它的相依性是由右到左,所以等號是右相依的,從右運算到左。所以在一行程式碼裡面所有運算子都有相同優先性的時候,就要用相依性決定順序,決定哪一邊要先被呼叫。

有趣的是,運算子通常需要 2 個參數來回傳一個值,加號回傳 2 個參數的總和,但等號會回傳什麼?

b 的值被設定等於右邊 c 的值,然後回傳右邊的參數,所以等於 4。相依性幫助在優先性相同的時候發揮作用。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2020 CYC'S BLOG All Rights Reserved.

UV : | PV :