Javascript 基本概念(操作符)

《Javascript 基本概念(操作符)》

操縱符

一元操縱符

只能操縱一個值的操縱符叫一元操縱符

++ 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位示意數值。

  • 正數

二進制示意,沒有用到的位補0,如18用二進制示意為00000000000000000000000000010010,第一位是標記位,后27位均用0補位,10010是有用位。

  • 負數

二進制補碼示意,盤算一個數值如-18的補碼須要三步:

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

注重(-18).toString(2)的效果是-10010而不是11111111111111111111111111101110,默許情況下ECMAScript中的整數都是有標記的,存在無標記整數,無標記整數能示意的數值更大。
對非數值運用一下報告的位操縱,會起首舉行Number()轉化,位操縱視NaN Infinity為0
一切的按位操縱符的操縱數都會被轉成補碼情勢的有標記32位整數。

按位非 ~

求反碼,實質是求操縱數的負值減一。
為了輕易考證,我們用五位示意

  • 取反碼

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、undefinednullNaNtrue
對象、非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, 只末了一項有用

    原文作者:Sue1024
    原文地址: https://segmentfault.com/a/1190000014827634
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞