優先性 與 相依性


Posted by hoyi-23 on 2021-05-19

var a = 2 * 2 + 2 * 3;

有很多的運算子,運算的順序是如何決定的呢?

優先性 Precedence

優先序較高的運算子會成為優先序較低運算子的運算元。
簡單來說,就是優先序較高的運算子會先進行。
以上個例子來說,乘號相較加號優先性較高。因此會行運算(2乘2)與(2乘3),再進行相加。
'='等號運算子的優先性很低,通常是最後才會賦值。

相依性 Associativity

相依性決定運算方向。若運算子優先性相同,會由左至右運算。

var a = 2+2+2+2; //左->至

但這邊要注意,'='等號運算子的相依性相反。它是從右邊賦予值到左邊。

例題

一般運算子由左至右

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

為甚麼反過來就回傳錯誤呢?
因為它的運算程序是這樣的:

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

等號運算子由右至左

範例一:

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

這段的執行順序:

b = 3;
a = 3賦予給b的回傳結果;

範例二:

var b = {};
Object.defineProperty(b, 'a', {
    value:2,
    writable: false
});
//在b物件下,新增屬性 a,a屬性的值為 2,並為不可寫入。
//object.defineProperty()物件下新增屬性

b.a = 3;
console.log(b.a); // 2 ,b.a的值不會被賦寫

var a = 3; //若我們重新定義
a = b.a = 1; //現在這個a會是多少呢?
console.log(a, b.a) // 1  2

為什麼 a 會是 1 呢?

a = b.a = 1;
//a 接收的是 b.a = 1; 回傳的值,也就是1。
//b.a = 1;在這邊是表達式,表達式都會回傳結果,它與上面的b.a沒有關係。









Related Posts

Fibonacci sequence

Fibonacci sequence

pure function

pure function

TCP/IP 是什麼?

TCP/IP 是什麼?


Comments