JavaScript操做符的一些注意要點

操做符

在ECMA-262 中,描述了一組用於操做數據值的操做符,包括算術操做符(如加減符號)、位操做符、關係操做符和相等操做符。編程

一元操做符

智能操做一個值的操做符叫作一元操做符。app

遞增和遞減操做符

此類操做符是借鑑於C 語言,有兩個版本,一種是前置型,一種是後置型。性能

前置型操做符

在執行前置型操做符時,變量的值都是在語句被求值之前改變的。(副效應)如:編碼

var num1 = 10;
var num2 = 20;
var num3 = --num1 + num2;
var num4 = num1 + num2;
document.write(num3 + " " + num4); //29 29
//因爲是前置型遞減操做符,num3 在計算結果出來以前,num1 已是9 了,因此num3 的計算結果就是29;一樣的,因爲計算num3 以後,num1 是9,因此num4 一樣是29。

後置型操做符

區別就是符號放在變量的後面,以及操做符是在包含他們的語句求值以後才執行的。如:code

var num1 = 10;
var num2 = 20;
var num3 = num1-- + num2;
var num4 = num1 + num2;
document.write(num3 + " " + num4);//30 29
//因爲是後置型遞減操做符,num3 在計算結果出來以後,num1 才變成9,因此num3 的計算結果仍然是30;一樣的,因爲計算num3以後,num1才變成9,因此num4 則是29.

應該注意的是,此類操做符對任何值都適用。它們不只適用於整數,也適用於字符串、布爾值、浮點數值和對象。如:對象

var a = "12";
var b = "abc";
var c = true;
var d = 0.123;
var object = {
    valueOf: function(){
        return 1;
    }
}
document.write(++a); //13
document.write(++b); //NaN
document.write(++c); //2
document.write(++d); //1.123
document.write(++object); //2

一元加和減操做符

此類操做符的做用與數學常識徹底同樣,再也不詳述。此類操做符主要用於基本的算術運算。ip

位操做符

ECMAScript 中的全部數值都是以IEE-754 64 位格式儲存的,但位操做符並不直接操做64 位的值。而是先轉換成32 位,操做以後再存儲爲64位。對於有符號的整數,32 位的前31 位用於表示整數的值。第32位用來表示數值的符號。0 爲正,1 爲負。這個表示符號的位就是符號位。字符串

那麼在JavaScript 中如何將數值或字符串轉換成二進制字符串呢?以下:數學

var a = "18";
var numA = parseInt(a,10).toString(2);
document.write(numA); //10010

按位非(NOT)

由波浪線(~)表示。執行按位非就是返回數字的反碼,就是操做數的負值-1。如:it

var a = "18";
var numA = parseInt(a,10).toString(2);
document.write(numA); //10010
document.write(~numA); //-10011
//這裏,18 的二進制碼就是10010,它的反碼就是-10011

轉換二進制和十進制的方法以下:

var a = "12";
var x = parseInt(a,10).toString(2);
document.write("這個數的二進制碼是:" + x);
document.write("<br/>");

var y = ~x;
document.write("這個數的二進制反碼是:" + y);
document.write("<br/>");

var b = parseInt(x,2).toString(10);
document.write("您輸入的數字是:" + b);

/*
這個數的二進制碼是:1100
這個數的二進制反碼是:-1101
您輸入的數字是:12
*/

按位與(AND)

用& 字號表示。簡單的說就是按位與操做只在兩個數值的對應位都是1 時才返回1,任何一位是0,結果都是0.如:

var num1 = 25;
var num2 = 3;
document.write(num1 & num2) //1
//首先其底層操做實際上就是25 和3 的二進制碼在對應位都是1 時才返回1,其餘都是0,因此結果就是十進制1 的二進制碼。

按位或(OR)

用| 豎線符號表示,簡單的說就是有一個位是1 的狀況下就返回1,而只有在兩個位都是0 的狀況下才返回0。如:

var num1 = 25;
var num2 = 3;
document.write(num1 | num2) //27

按位異或(XOR)

用^ 插入符號表示,簡單的說就是對應位上只有一個1 時才返回1,若是對應的兩位都是1 或都是0,則返回0。如:

var num1 = 25;
var num2 = 3;
document.write(num1 ^ num2) //26

左移

用<< 兩個小於號來表示,這個操做符會將數值的全部位向左移動指定的位數。如:

var num1 = 2;
var num2 = num1 << 5;
document.write(num2); //64

有符號的右移

用>> 兩個大於號來表示,可是保留符號位!如:

var num1 = -64;
var num2 = num1 >> 5;
document.write(num2); //2

無符號的右移

用>>> 三個大於號來表示,這樣就沒有辦法保留符號位了!如:

var num1 = 64;
var num2 = num1 >>> 5;
document.write(num2); //2
//對於正數來講,結果依然仍是原來的結果(保留符號位)

var num1 = -64;
var num2 = num1 >>> 5;
document.write(num2); //134217726
//可是對於負數,結果就不一樣了(不保留符號位)

布爾操做符

主要用來執行if...else 等循環之類的語句。包括邏輯非(!)、邏輯與(&&)以及邏輯或(||)

邏輯非

用! 歎號表示。主要規則以下:

  • 若是操做數是對象,返回false;

  • 若是操做數是空字符串,返回true;

  • 若是操做數是數值0,返回true,非零(包括infinity),返回false;

  • 若是操做數是null、NaN、undefined,返回true;

具體例子以下:

var obj = {};
document.write(!obj); //false
var str = "";
document.write(!str); //true
var num = Infinity;
document.write(!num); //false
var thing = NaN;
document.write(!thing); //true

邏輯與

用&& 兩個和號表示。主要規則以下:

  • 若是第一個操做數是對象,則返回第二個操做數;

  • 若是第一個操做數求值結果是true,且第二個操做數是對象,則返回第二個操做數;

  • 若是兩個操做數都是對象,則返回第二個操做數;

  • 若是有一個操做數是null、NaN或者undefined,則返回null、NaN或undefined;

具體例子以下:

var obj1 = {};
var obj2 = {name:"-helloworld-"};
var result1 = (obj1 && 321);
document.write(result1); //321 第一個是true 的對象,返回第二個操做數
var result2 = (!obj1 && 321);
document.write(result2); //false 第一個是false,沒有必要對321 求值
var result3 = (obj1 && obj2.name);
document.write(result3); //"-helloworld-" 第一個是true 的對象,返回第二個對象的操做數
var result4 = (321 && 33);
document.write(result4); //第一個爲true,返回第二個操做數
var result5 = (321 && null);
document.write(result5); //第一個爲true,返回null

值得注意的是,若是第一個操做數可以決定結果,那麼就不會對第二個操做數求值。如:

var x = true;
var y = {name:"helloworld"};
var result = (x && y.name);
document.write(result); //"helloworld" 第一個操做數不能斷定結果,要繼續執行下一個操做數,才能執行document.write

var x = true;
var result = (x && z);
document.write(result); //因爲z 沒有被定義,這裏會發生錯誤,不會執行document.write

var x = false;
var y = {name:"helloworld"};
var result = (x && y.name);
document.write(result); //false 第一個操做數可以斷定結果,不須要執行下一個操做數,就能夠直接執行document.write

var x = false;
var result = (x && z);
document.write(result); //false 第一個操做數可以斷定結果,不須要執行下一個操做數,因此不管下一個操做數是否被定義,不會發生錯誤。均可以直接執行document.write

邏輯或

用|| 兩個豎線符號表示。主要規則以下:

  • 若是第一個操做數是對象,則返回第一個操做符;

  • 若是第一個操做數的求值結果是false,則返回第二個操做數;

  • 若是兩個操做數都是對象,則返回第一個操做數;

  • 若是兩個操做數都是null、NaN或者undefined,則返回null、NaN或undefined;

值得注意的是,若是第一個操做數的求值結果是true,就不會對第二個操做數求值了。如:

var x = true;
document.write(x || z); //true 雖然這裏並無定義z 可是因爲第一個操做數可以斷定結果,則不須要繼續對第二個操做符進行求值

var x = false;
document.write(x || z);
document.write("false"); //這裏之因此不會返回false,是由於在第一個操做數斷定不告終果的狀況下,會對第二個操做數進行求值,可是第二個操做數未定義。因此會出現錯誤。

另外,還須要注意的是,咱們能夠利用邏輯或的這一行爲來避免爲變量賦予null 或 undefined 值。例如:

var str1 = "hello there!";
var str2 = null;
var str = str2 || str1;
document.write(str);
str2 = undefined;
var str = str2 || str1;
document.write(str);
//這樣就能規避其中一個操做數是null 或者undefined,把第二個操做數做爲後備值

乘性操做符

ECMAScript 定義了3個乘性操做符:乘法、除法和求模。

乘法

用* 星號表示該操做符。

主要規則有:

  • 若是計算結果超過了表示範圍,則會返回+/-Infinity;

  • 若是有一個操做數是NaN,則結果是NaN。

  • 若是是Infinity 與0 相乘,則結果是NaN。

  • 若是Infinity 與 Infinity 相乘,則結果是+/-Infinity;

  • 若是其中一個操做數不是數值,後臺將會先用Number()對齊進行轉換,而後按照上面的規則求值。

具體例子:

var result = (-Number.MAX_VALUE * Number.MAX_VALUE)
document.write(result) //-Infinity
result = (NaN * 321);
document.write(result) //NaN
result = (-Infinity * 0);
document.write(result) //NaN
result = (Infinity * -Infinity);
document.write(result) //=Infinity
result = (1 * "321");
document.write(result) //321
result = (1 * false);
document.write(result) //0

除法

用/ 斜線符號表示。

主要規則以下:

  • 若是計算結果超過了表示範圍,則會返回+/-Infinity;

  • 若是有一個操做數是NaN,則結果是NaN;

  • 若是是0 除以0,結果則是NaN;

  • 若是是非零的有限數被0 除,結果是+/-Infinity;

  • 若是是Infinity 被任何非零數值除,結果則是+/-Infinity;

具體例子以下:

var result = (Number.MAX_VALUE / Number.MIN_VALUE);
document.write(result) //Infinity
result = (NaN / Number.MIN_VALUE);
document.write(result) //NaN
result = (0 / 0);
document.write(result) //NaN
result = (-421 / 0);
document.write(result) //-Infinity
result = (-Infinity / 2);
document.write(result) //-Infinity

求模

用% 百分號表示,求模就是求餘數。

主要規則以下:

  • 若是被除數是無窮大,除數是有限大,則返回NaN;

  • 若是被除數是有限大,除數是0,則返回NaN;

  • Infinity 除以Infinity 結果是NaN;

  • 被除數是有限大,除數是無窮大,結果是除數;

  • 被除數若是是0,結果就是0;

  • 若是其中一個操做數不是數值,則後臺先轉換成數值再進行上述規則。

具體例子以下:

var result = (Infinity % 2);
document.write(result) //NaN
var result = (2 % 0);
document.write(result) //NaN
var result = (Infinity % Infinity);
document.write(result) //NaN
var result = (2 % Infinity);
document.write(result) //2
var result = (0 % 2);
document.write(result) //0

加性操做符

加法

用+ 加號表示,規則以下:

  • 若是一個操做數是NaN,則結果是NaN;

  • 若是是Infinity 加-Infinity,結果是NaN;

  • 若是是Infinity 加Infinity,結果是Infinity;

  • 若是是-Infinity 加-Infinity,結果是-Infinity;

  • 若是是+0 加-0,結果是+0;

  • 若是是+0 加+0,結果是+0;

  • 若是是-0 加-0,結果是-0;

  • 若是兩個操做數都是字符串,則拼接兩個字符串;

  • 若是隻有一個操做數是字符串,則將另外一個轉換成字符串再拼接起來;

具體例子以下:

var num1 = NaN;
var num2 = Infinity;
var result = num1 + num2;
document.write(result); //NaN
var num1 = Infinity;
var num2 = -Infinity;
var result = num1 + num2;
document.write(result); //NaN
var num1 = Infinity;
var num2 = Infinity;
var result = num1 + num2;
document.write(result); //Infinity;
var num1 = -Infinity;
var num2 = -Infinity;
var result = num1 + num2;
document.write(result); //-Infinity
var num1 = "hello ";
var num2 = "there";
var result = num1 + num2;
document.write(result); //"hello there"
var num1 = 1000;
var num2 = " there";
var result = num1 + num2;
document.write(result); //"1000 there"
var result_num = parseInt(result);
document.write(result_num);//能夠證實result 是字符串

值得注意的是,加性操做符在編程中的常見的錯誤:

var num1 = 11;
var num2 = 100;
document.write("the result is " + num1 + num2); //"the result is 11100" 錯誤,num1 和num2 被拼接成字符串
document.write("the result is " + (num1 + num2)); //「the result is 111」 正確,括號內的爲計算值

減法

用- 減號表示,規則以下:

  • 若是一個操做數是NaN,結果是NaN;

  • 若是Infinity 減Infinity,結果是NaN;

  • 若是-Infinity 減-Infinity,結果是NaN;

  • 若是Infinity 減-Infinity,結果是Infinity;

  • 若是-Infinity 減Infinity,結果是-Infinity;

  • 若是是+0 減+0,結果是+0;

  • 若是是+0 減-0,結果是-0;

  • 若是是-0 減-0,結果是+0;

  • 若是有一個操做數是字符串、布爾值、null 或undefined,則後臺會先把它轉換成數值;

具體例子以下:

document.write(3 - null); //3
document.write(NaN - true); //NaN
document.write(3 - ""); //3
document.write(3 - "1"); //2
document.write(Infinity - Infinity); //NaN
document.write(-Infinity - Infinity); //-Infinity

關係操做符

用< 小於、> 大於、<= 小於等於、>= 大於等於表示。規則是:

  • 若是兩個操做數都是字符串,則比較兩個字符串對應的字符編碼值;

  • 若是一個操做數是數值,則將另外一個操做數轉換成一個數值再比較;

  • 若是一個操做數是數值,則將另外一個操做數轉換成一個數值,當不能轉換成數值時,會當作NaN 進行比較,可是與NaN 進行比較的結果都是false;

  • 大寫字母的字符編碼所有小於小寫字符編碼;

具體例子以下:

document.write("Blackbarry" < "apple"); //true 大寫字母字符編碼小於小寫字符編碼
document.write("blackbarry" < "apple"); //false
document.write("10" < "3"); //true 兩個都是字符串 因此比較的是字符編碼
document.write("10" < 3); //false 「10」字符串被轉換成10 數值,比較數值大小
document.write("a" < 3); //false "a"字符串被轉換成了NaN,任何操做數與NaN 比較都是false;

相等操做符

用== 表示相等、!= 不等、=== 全等、 !==不全等。

相等和不等

規則以下:

  • null 和undefined 是相等的

  • 若是一個操做數是NaN,相等則返回false,不等則返回true。若是兩個操做符都是NaN,相等仍是返回false,由於NaN 與NaN 不相等;

  • 若是兩個操做數都是對象,則比較他們是否是同一個對象;

具體例子以下:

document.write(null == undefined); //true
document.write(null == NaN); //false
document.write(NaN == NaN); //false
document.write("NaN" == NaN); //false
document.write("null" == undefined); //false
document.write(0 == undefined); //false
document.write(0 != "0"); //false
document.write(0 != false); //false

全等和不全等

與相等和不等相似,例子以下:

document.write(undefined === null); //false 兩個是不一樣類型的值
document.write(undefined == null); //true 兩個是不一樣類型的值 但相等 不全等
document.write("21" == 21); //true
document.write("21" === 21); //false

千萬注意null 和undefined 是相等但不全等

條件操做符

語法形式是:

變量 = 條件 ? true : false;

舉個例子:

var num1 = 10;
var num2 = 30;
var num = (num1 > num2) ? num1 : num2;
document.write(num); //30 選擇最大的那個賦值給變量並打印出來

賦值操做符

用= 等號來表示,另外,複合賦值操做還能夠用複合賦值操做符來表示。如:

var x = 10;
x = x + 1;
document.write(x); //11
//上面這種能夠寫成下面這種
var x = 10;
x +=1;
document.write(x); //11
var x = 10;
x *=2;
document.write(x); //20

其餘還有:

  • (*=)

  • (/=)

  • (%=)

  • (+=)

  • (-=)

  • (<<=)

  • (>>=)

  • (>>>=)

值得注意的是,使用上面這些並不能帶來任何性能的提高,無非是省了幾個字符

逗號操做符

逗號操做符能夠在一條語句中執行多個操做,如:

var num1 = 1,
num2 = 2,
num3 = 3;
document.write(num1 + num2 + num3) //6

另外,逗號也能夠用來賦值,逗號最後面的數值會被賦值到變量中。好比:

var x = (1,2,3,4,5);
document.write(x); //5
var x = (1,2,3,4,5,);
document.write(x); //出現錯誤
相關文章
相關標籤/搜索