標籤:異或 區別 賦值 對象 算術運算 刪除 body idt 自增
在所有的運算裡,都是有運算順序的。小時候學算術運算的時候,我們都知道這麼一個規則:先乘除後加減,有括弧要先算括弧!
同樣的,在JavaScript裡面,運算子的優先順序如下表所示,前面的優先順序高於後面的
運算子 |
操作 |
++ |
自增(注意前後的區別) |
-- |
自減(注意前後的區別) |
- |
求反(針對數字) |
+ |
轉換成數字 |
~ |
按位求反 |
! |
邏輯非 |
delete, typeof, void |
刪除屬性,檢查資料類型,返回undefined的值 |
*, /, %
|
乘,除,求餘 |
+, - |
加,減 |
+ |
字串串連 |
<<, >>, >>> |
左移位,有符號的右移位,無符號的右移位 |
<, <=, >, >= |
比較大小,先比數字,後比字母 |
== |
判斷是否相等 |
!= |
判斷是否不等 |
=== |
判斷是否恒等 |
!== |
判斷是否不恒等 |
& |
按位與 |
^ |
按位異或 |
| |
按位或 |
&& |
邏輯與 |
|| |
邏輯或 |
?: |
條件運算子 |
= |
賦值運算子 |
op= |
運算且賦值 |
下面舉個栗子
var a = {n: 1};var b = a;a.x = a = {n: 2};console.log(a.x); // undefinedconsole.log(b.x); // {n: 2}// a => {n: 2}// b => {// n: 1, // x: {n: 2 }// }
解析:
雖然賦值運算子是從右至左計算,但是這裡也有一個很重要的考點:運算子的優先順序
.點號運算 優於 =賦值運算,因此 a.x = a = {n: 2} 可以理解為:
1). 聲明a對象中的x屬性,而此時b和a同時指向對象{n: 1, x: undefined},即同時擁有未賦值的x
2). 從右至左開始賦值
1>. 對 a對象 賦值 -- a = {n: 2},此時變數名a改變指向 到 新對象{n: 2}
2>. 對 a.x(可以理解為b.x,就是說a.x已經確定了指向,因此不會受到1>步的影響) 屬性賦值{n: 2},此時對象b -> {n:1, x:{n:2}}
JavaScript 基本文法 -- 運算子的優先順序