javaScript 運算符

算術運算符: + 、- 、 * 、 / 、% 、++ 、-- ;   注意: 除了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

相關文章
相關標籤/搜索