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沒有關係。