welcome to Cheeto's blog

0%

JavaScript核心篇:優先性、相依性

優先性及相依性

優先性

優先序較高的運算子會成為優先序較低的運算子的運算元。例:乘除的符號優先性大於加減,所以會先乘除後加減。

相依性

相依性決定運算方向。例:加減乘除都是由左至右、等號則是由右至左。
而當優先性相同時依據相依性的運算方向執行。

加減乘除優先性

var a = 2 * 2 + 2 * 3; 為例子

加減乘除優先性

因為 *(乘號)的優先性大於 +(加號),所以會先進行乘的動作,接著乘出來的數字就是 +(加號)的運算元,這也符合描述的優先性。

等號優先性

等號的相依性是由右至左,而且優先性其實不高。

等號優先性

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

因為等號是由右至左,所以拆解出來會像下面這樣

1
2
b = 3; // 3
a = b; // 3

但是這邊要注意的一點是,a 雖然是 3 沒有錯,但是它是取到 b 的,所以 a 取到的是 b 的回傳結果。


接下來看到另外一個範例

1
2
3
4
5
6
7
8
9
var b = {};
Object.defineProperty(b, 'a', {
value: 2, // 值 = 2
writable: false // 不可寫入
});
var a = 1;
a = b.a = 1;

console.log(a, b.a) // 1 , 2

a 會回傳 1 的原因是因為所有表達式都會回傳值,如果沒有去接收它的話,它會立即釋放不會儲存,變成只是一個過程。(如下圖)
= 也是表達式,它的功能是將右側的值賦予至左側,居然它是表達式它就必須要回傳 ,而它回傳的值都是以右側來做表示的。

範例

大於小於的優先性

大於小於優先性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
console.log(1 < 2 < 3); // true

// 可以拆解成
console.log(1 < 2); // true
console.log(true < 3); // true
console.log(1 < 3); //true 會因為型別的轉換會轉換成 1


console.log(3 > 2 > 1); // false

// false 的原因,會被拆解成下列這樣
console.log(3 > 2); // true
console.log(true > 1); // false
console.log(1 > 1); // false 會因為型別的轉換會轉換成 1