算術運算符: + 、- 、 * 、 / 、% 、++ 、-- ; 注意: 除了NaN與字符串相加外,任何與NaN進行運算的結果都返回NaN數組
「 + 」 、「 - 」: 若是是一元運算符(只操做一個數),返回操做數的數值;若是操做數不是數值,等同於Number(操做數); 函數
若是是操做兩個數值(字面量或變量):性能
「 - 」減法, 會將兩個操做數轉爲數值來計算;this
「 + 」加法, 若是操做數沒有字符串,則將操做數(不是數值的話)轉爲數值,而後兩數相加;編碼
若是操做數有一個是字符串,則將另外一個操做數(不是字符串的話)轉爲字符串,而後兩字符串拼接;spa
「 * 」 、「 / 」: 乘法和除法都是把兩操做數轉爲數值(若是不是數值的話)再進行運算;prototype
「 * 」 有一個特殊的是: Infinity * 0 結果是 NaN;對象
「 / 」 除法中0能夠作除數: 0/0 結果爲NaN 非0/0 結果爲Infinity;繼承
「 % 」: 取模,操做數轉爲數值再進行計算;索引
「 ++ 」、「 -- 」 遞增遞減會先把操做數轉爲數值(若是不是數值的話);
與其它運算在一塊的時候,前置++(--)是先運算再賦值,後置++(--)是先賦值再運算;
邏輯運算符:!、&&、||
「 ! 」邏輯非,對操做數布爾值取反; 「 !! 」對操做數轉爲布爾值 等同於 Boolean();
「 && 」邏輯與,第一個操做數爲真,返回第二個操做數;
第一個操做數爲假,不執行第二個操做數,返回false(若是第一個操做數是那五個(NaN,null,undefined,0,'')直接返回第一個操做數);
「 || 」 邏輯或,第一個操做數爲真,返回第一個操做數;
第一個操做數爲假,返回第二個操做數;
&&與|| 都是短路操做符
關係運算符:>、<、>=、<=
若是一個操做數爲數值,則另一個操做數轉爲數值(不是的話)進行比較;若是轉爲NaN的話返回false;
若是兩個操做數都是字符串,則比較兩個操做數對應的字符編碼;
相等運算符:==、!=、===、!==
==和!= 會進行類型轉換; === 與 !== 不進行轉換判斷
條件運算符:? :
三元運算:x?a:b x是真值就執行a ; x是假值就執行b
二進制位運算符:~、&、| 、^ 、<< 、>>、>>>
十進制轉換二進制:短除法;
求負數的二進制:- 二進制補碼 - 先求絕對值,而後再求二進制,再反碼,再加1;
~ 按位非 返回數值的反碼,二進制0變爲1,1變爲0; ~num === -num-1;
& 按位與 兩位數值進行比較,相同位都是1返回1,其它返回0,而後返回新數值; 1010 & 0110 返回 0010;
| 按位或 兩位數值進行比較,相同位只要有1的就返回1,沒1返回0,而後返回新值; 1010 | 0110 返回1110;
^ 按位異或 兩個操做數相同位只有一個1時返回1,其它都返回0,而後返回新值; 1010 ^ 0110 返回 1100;
<< 左移 左移不影響操做數的符號,操做數向左移動,0填充空位; 1010 << 2 返回 101000;
>> 有符號右移 右移保留操做數的符號位,在符號位的右側填充空位(正數填充0,負數填充1);-18 >> 2 返回 -5;
>>> 無符號右移 它是用0來填充空位, 對於正數和有符號右移返回一致; 對於負數,無符號右移會把負數二進制碼看成正數二進制碼,移動後不會求其反碼;-18 >>> 2 返回 1073741819;
賦值運算符:=、+(-*/%>>><<>>&|^)=
「 = 」 賦值,右邊值賦給左邊;
「 +(-*/%>>><<>>&|^)= 」 簡化賦值操做,不會帶來性能提高;
逗號操做符:,
賦值時,返回最後一項; var num = ( 1, 2, 3 ); num 返回3;
其它經常使用運算符:
new 用來建立對象實例,new constructor([ arguments ]),好比:執行 var fun = new Fun( ) 時執行如下步驟(Fun是定義的構造函數):
①、首先建立空對象,至關於 { };
②、用該空對象調用構造函數,此時 this 指向該正在建立的空對象,按構造函數的定義,爲該對象添加屬性和方法;
③、將新建立對象的__proto__屬性指向構造函數的prototype對象;
④、將空對象的地址保存在等號左邊的變量中;
( 通常狀況,構造函數不返回值,可是用戶能夠主動返回對象,來覆蓋正常的建立對象步驟)
沒有指定參數列表的時候,new Fun 等同於 new Fun();
in 用來檢測一個對象是否包含指定屬性(包括從原型鏈上繼承來的), '屬性名' in obj (數組檢測的是索引)右操做數必須是對象;
instanceof 用來檢測構造函數的原型是否在這個對象的原型鏈中 obj.instanceof constructor(constructor.prototype是否在obj的原型鏈上),也就是obj的原型鏈上是否找的到該構造函數的原型;
三個基本包裝類型 (經過new 調用)構建出來的對象與字面量定義的對象({ }) instanceof Object 都返回true; 包裝類型 instanceof 各自的構造函數都返回true;
typeof 主要用來檢測基本類型;
instanceof 主要用來檢測 對象 是不是某個構造函數的實例;
isPrototypeOf 也是用來檢測 一個對象是否在另外一個對象的原型上;
A.instanceof B B的原型是否在A的原型鏈上,A的原型鏈針對B的原型(B.prototype)檢測;
A.isPrototypeOf(B) A對象是否在B的原型鏈上,是對B的原型鏈和A(不是A的原型,或許A自己就是原型對象)檢測;
運算符優先級:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence