Javascript 基本概念(操做符)

操做符

一元操做符

只能操做一個值的操做符叫一元操做符express

++ and --
  • 前置遞增和遞減,在語句求值以前改變數值的大小
  • 後置遞增和遞減,在語句求值以後改變數值的大小

好比:編程

var age = 18;
var now = ++age - 10; // now = 9, age = 19
var now = age++ - 10;  // now = 9, age = 20

前置遞增、遞減和後置遞增、遞減可用於操做整數、浮點數、布爾值、字符串、對象,ECMAScript會根據前面提到過的各類數據類型轉化成數值類型的規則,先將值轉化爲數值,而後加減1安全

一元+ and -

+放在數值前面,不會有任何影響,-使負數變爲正數,正數變爲負數,當一元+用在非數值前面,會試圖將它們轉化爲數值,規則同以前講過的,而一元-用在非數值前面,會首先將它們轉化爲數值,再變成相應的負數。編碼

位操做符

ECMAScript中的數值以IEEE-754 64 位格式存儲,使用位操做符操做數值時,現將該數值轉化爲32位,而後進行計算,最後再轉化成64位。
對於有符號的整數,第一位是符號位(0正數,1負數),後31位表示數值。spa

  • 正數

二進制表示,沒有用到的位補0,如18用二進制表示爲00000000000000000000000000010010,第一位是符號位,後27位均用0補位,10010是有效位。code

  • 負數

二進制補碼錶示,計算一個數值如-18的補碼須要三步:對象

  1. 求這個數值絕對值的二進制,即00000000000000000000000000010010
  2. 求二進制的反碼(0爲1,1爲0),即11111111111111111111111111101101
  3. 加一,即11111111111111111111111111101110

注意(-18).toString(2)的結果是-10010而不是11111111111111111111111111101110,默認狀況下ECMAScript中的整數都是有符號的,存在無符號整數,無符號整數能表示的數值更大。
對非數值應用一下講述的位操做,會首先進行Number()轉化,位操做視NaN Infinity爲0
全部的按位操做符的操做數都會被轉成補碼形式的有符號32位整數。ip

按位非 ~

求反碼,本質是求操做數的負值減一。
爲了方便驗證,咱們用五位表示rem

  • 取反碼

abcde——1-a 1-b 1-c 1-d 1-e字符串

  • 負值減一

abcde——1-a 1-b 1-c 1-d 1-e——1-a 1-b 1-c 1-d 2-e
1-a 1-b 1-c 1-d 2-e - 1 = 1-a 1-b 1-c 1-d 1-e
可見是相等的。

按位與 &

將兩個數值按位對齊,若是同一位上均爲1,則返回結果的這一位爲1,不然爲0。
好比:
45 & 67; //1
00000000000000000000000000101101
00000000000000000000000001000011
結果爲:
00000000000000000000000000000001

按位或 |

將兩個數值按位對齊,若是同一位均爲0,則返回結果的這一位爲0,不然爲1。

45 | 67; //111
0000000000000000000000000101101
0000000000000000000000001000011
結果爲:
00000000000000000000000001101111

按位異或 ^

將兩個數值按位對齊,若是同一位數值不一樣,則返回結果的這一位爲1,若相同,則爲0。
45 ^ 67; //110
0000000000000000000000000101101
0000000000000000000000001000011
結果爲:
00000000000000000000000001101110

左移 <<

向左移動必定位數,不改變符號位,空出來的位置補0(補0的個數與移動位數相同)
45 ^ 5; //1440
0000000000000000000000000101101
結果爲:
00000000000000000000010110100000

右移 >>

45 >> 5; //1
0000000000000000000000000101101
結果爲:
00000000000000000000000000000001
向右移動必定位數,不改變符號位,空出來的位置補0(補0的個數與移動位數相同)

無符號右移 >>>

向右移動必定位數,改變符號位,空出來的位置補0(補0的個數與移動位數相同)

  • 正數

>>(用於填充空位的0與符號位相同,等於填充了符號位)

  • 負數

無符號右移操做符會把負數的二進制碼當成正數的二進制碼
-64>>>25; // 127
11111111111111111111111111000000
結果爲:
00000000000000000000000001111111

布爾操做符

邏輯非 !

能夠操做任何數據類型,首先對其取布爾值,而後取反

布爾值
空字符串、0、undefinednullNaN true
對象、非0、非空字符串 false

!!至關於Boolean能夠返回這個值真正對應的布爾值。

邏輯與 &&

邏輯與有兩個操做數,只有true && true纔會返回true,能夠操做任何數據類型。
若是有一個或兩個操做數不是布爾值,邏輯與不必定返回布爾值,規則以下:

  • 若是第一個是對象,返回第二個操做數
  • 若是第二個是對象,在第一個求值結果爲true時返回第二個
  • 若是第一個是null,返回null
  • 若是第一個是undefined,返回undefined
  • 若是第一個是NaN,返回NaN

邏輯與是短路操做,若是第一個操做數能夠決定求值結果,就不會對第二個操做數求值,當第一個操做數求值爲false,則表達式結果爲false

邏輯或 ||

邏輯或有兩個操做數,只有false || false纔會返回false,能夠操做任何數據類型。
若是有一個或兩個操做數不是布爾值,邏輯或不必定返回布爾值,規則以下:

  • 若是第一個操做數是對象,則返回第一個操做數
  • 若是第一個對象的求值結果爲false,則返回第二個操做數
  • 若是兩個操做數都是null,則返回null
  • 若是兩個操做數都是NaN,則返回NaN
  • 若是兩個操做數都是undefined,則返回undefined

邏輯或也是短路操做符,若是第一個求值結果爲true,則返回true
咱們能夠利用邏輯或的這一行爲來避免爲變量賦null 或undefined 值。

var myObject = preferredObject || backupObject;

若是preferredObjectnull or undefined, 會將backupObject的值賦給myObject

乘性操做符

若是參加乘性操做的操做符不是數值,會調用Number()將其轉爲數值,這一過程在這一節中再也不贅述。

乘法 *

乘法遵循如下規則:

  • 若是操做數都是數值,執行常規的乘法運算
  • 有一個操做數是NaN,則結果是NaN
  • Infinity * 0; // NaN
  • Infinity與非0(包括無窮)相乘,結果爲無窮
除法 /

除法遵循如下規則:

  • 若是操做數都是數值,執行常規的除法運算
  • 有一個操做數是NaN,則結果是NaN
  • Infinity/Infinity; // NaN
  • 0/0; // NaN
  • 非零的數除以0,結果爲無窮
  • 無窮被非零的數相除,結果爲無窮
求模 %

求模遵循如下規則:

  • 若是操做數都是數值,執行常規的求模運算
  • 無窮大除以有限大的數值,餘數運算結果爲`NaN
  • 有限大的數值除以0,餘數運算結果爲NaN
  • Infinity除以Infinity,餘數運算結果爲NaN
  • 有限大的數值除以無窮大,餘數運算結果爲被除數
  • 被除數是0,除數不爲NaN或0,結果爲0
5 / 0 % 5; // NaN
5 % 0; // NaN
5 / 0 % (5 / 0); // NaN
5 % (5 / 0); // 5
0 % 0; // NaN
0 % (5 / 0); //0
0 % 5; //0
0 % (5 % 0); //NaN

加性運算符

加法 +
  1. 若是兩個操做數都是數值,則遵循如下規則:
  • Infinity + Infinity; // Infinity
  • -Infinity + (-Infinity); // -Infinity
  • -Infinity + Infinity; // NaN
  • +0 + (+0); // +0
  • -0 + (-0); //-0
  • -0 + (+0); // +0
  1. 若是有操做符是字符串,則遵循如下規則:
  • 若是兩個都是字符串,則將兩個字符串拼接起來
  • 若是隻有一個是字符串,則把非字符操做數轉化爲字符串,拼接起來
忽視加法操做中的數據類型是ECMAScript 編程中最多見的一個錯誤。再來看一個例子:
var num1 = 5;
var num2 = 10;
var message = "The sum of 5 and 10 is " + num1 + num2;
alert(message); // "The sum of 5 and 10 is 510"
減法 -

減法運算遵循如下規則:

  • 若是都是數值,執行常規減法操做
  • 若是有一個是NaN,則結果是NaN
  • Infinity - Infinity; // NaN
  • -Infinity - (-Infinity); // NaN
  • Infinity - (-Infinity); //Infinity
  • -Infinity - Infinity; //-Infinity
  • +0 - (+0); // +0
  • +0-(-0); // -0
  • -0 - (-0); // +0

關係操做符

包括< > <= >=,遵循以下規則:

  • 若是都是數值,進行數值大小比較
  • 若是都是字符串,則比較字符編碼值,有以下規則:
  1. 若是字符串相等返回值0
  2. 若是第一個字符和參數的第一個字符不等,結束比較,返回他們之間的編碼差值
  3. 若是第一個字符和參數的第一個字符相等,則以第二個字符和參數的第二個字符作比較,以此類推,直至比較的字符或被比較的字符有一方全比較完,這時就比較字符的長度。
  • 若是一個是數值,則另外一個轉化成數值,而後比較
  • 對象執行valueof(),若是沒有,調用其toString(),而後按上述規則比較

舉一些例子:

"23" < "3"; //true
"23" < 3; //false
"B" < "a"; //true,大寫字母的字符編碼所有小於小寫字母的字符編碼
"a" < 3; // false,"a"轉化爲NaN,NaN參與任何操做都返回NaN
"a" >= 3; //false

相等操做符

相等 == 和不相等 !=

先轉換操做數,再比較相等性,轉換的規則以下:

  • 若是有一個操做數是布爾型,將其轉化爲數值
  • 字符串與數值比較,字符串轉化爲數值
  • 對象與非對象比較,調用對象的valueof()獲得基本類型,再按以上規則比較

比較規則以下:

  • null == undefined; //true
  • 不會轉換undefinednull
  • NaN與任何操做數相等性比較,返回false,不相等性比較,返回true,包括NaN
  • 若是都是對象,看是否指向同一對象

舉一些例子:

undefined == 0; //false
null == 0; //false
NaN == NaN; //false
NaN != NaN; //false
true == 1; //true
false == 0; //true
"NaN" == NaN; // false
全等 === 和不全等 !==

不轉換操做數,直接比較,比較規則除了第一條均相同

undefined === null ; // false

能夠看出全等比相等要安全,不會強制轉換。

條件運算符

variable = boolean_expression ? true_value : false_value;
boolean_expression 若爲true,返回true_value,若爲false,返回false_value

賦值操做符 =

將右邊的值賦給左邊

複合賦值操做符:
  1. *=
  2. +=
  3. -=
  4. /=
  5. %=
  6. <<=
  7. >>=
  8. >>>=

num = num + 10;至關於num += 10;

逗號操做符

聲明變量

var a, b, c;

賦值

`a = (0, 1, 2, 3); //3, 只最後一項有效

相關文章
相關標籤/搜索