JavaScript操作符

一元操作符

只能操作一個(gè)值的操作符。

遞增和遞減操作符

  1. 前置型:位于要操作的變量之前;
  2. 后置型:位于要操作的變量之后。

如:

    var age = 24;
    ++ age;
    //等同于
    var age = 24;
    age = age + 1;

    var age = 24;
    -- age;
    //等同于
    var age = 24;
    age = age - 1;

副效應(yīng):執(zhí)行前置遞增和遞減操作時(shí),變量的值都在語(yǔ)句被求值前改變。

  var age = 24;
  var newage = --age + 2;
  console.log(age);         //值為23
  console.log(newage);      //值為25
  console.log(age + newage);         //值為48

后置型遞增和遞減操作是在包含她們的語(yǔ)句被求值之后才執(zhí)行。

  var age = 24;
  var newage = age-- + 2;
  console.log(age);         //值為23
  console.log(newage);      //值為26
  console.log(age + newage);         //值為49

遞增和遞減操作符遵循下列規(guī)則:

  • 如果字符串包含有效數(shù)字字符,先將其轉(zhuǎn)換為數(shù)字值,在執(zhí)行遞增和遞減操作,字符串變量變成數(shù)值變量;
  • 如果字符串不包含有效數(shù)字字符,將變量的值設(shè)置為NaN,字符串變量變成數(shù)值變量;
  • 布爾值true 或者false,將轉(zhuǎn)換為1或者0,再執(zhí)行遞增和遞減操作,布爾值變量變成數(shù)值變量;
  • 如果應(yīng)用于浮點(diǎn)數(shù)值,執(zhí)行遞增和遞減操作;
  • 如果應(yīng)用于對(duì)象,先調(diào)用對(duì)象的valueOf()方法,取得可供操作的值再應(yīng)用上述規(guī)則。
  var a = 24;
  var b = "a";
  var c = true;
  var d = 1.1;
  var e = {
    valueOf: function() {
      return -1;
    }
  };
  a++;
  b++;
  c++;
  d--;
  e++;
  console.log(a);   //值為25
  console.log(b);   //值為NaN
  console.log(c);   //值為2
  console.log(d);   //值為0.10000000000000009
  console.log(e);   //值為0

一元加和減操作符

一元加操作符以一個(gè)(+)表示,但是放在數(shù)值前面不會(huì)產(chǎn)生影響。

再對(duì)非數(shù)值應(yīng)用一元操作符時(shí),會(huì)先對(duì)值進(jìn)行轉(zhuǎn)換。

一元操作符還能用于表示負(fù)數(shù),也就是將正數(shù)轉(zhuǎn)換為負(fù)數(shù),但對(duì)非數(shù)值時(shí),也會(huì)先對(duì)它進(jìn)行轉(zhuǎn)換。

位操作符

這部分內(nèi)容來(lái)自于developer.mozilla.org/

有符號(hào)32位整數(shù)

位操作符用于在最基本的層次上,即按照內(nèi)存中表示數(shù)值的位來(lái)操作數(shù)值。

所有的按位操作符的操作數(shù)都會(huì)被轉(zhuǎn)成補(bǔ)碼(two's complement)形式的有符號(hào)32位整數(shù)。補(bǔ)碼形式是指一個(gè)數(shù)的負(fù)對(duì)應(yīng)值(negative counterpart)為數(shù)值的所有比特位反轉(zhuǎn)后,再加1。反轉(zhuǎn)比特位即該數(shù)值進(jìn)行’非‘位運(yùn)算,也即該數(shù)值的反碼。例如下面為整數(shù)314的二進(jìn)制編碼:

00000000000000000000000100111010

下面編碼 ~314,即 314 的反碼:

11111111111111111111111011000101

最后,下面編碼 -314,即 314 的補(bǔ)碼:

11111111111111111111111011000110

補(bǔ)碼保證了當(dāng)一個(gè)數(shù)是正數(shù)時(shí),其最左的比特位是0,當(dāng)一個(gè)數(shù)是負(fù)數(shù)時(shí),其最左的比特位是1。因此,最左邊的比特位被稱(chēng)為符號(hào)位(sign bit)。

0 是所有比特?cái)?shù)字0組成的整數(shù)。

0 (base 10) = 00000000000000000000000000000000 (base 2)

-1 是所有比特?cái)?shù)字1組成的整數(shù)。

-1 (base 10) = 11111111111111111111111111111111 (base 2)

-2147483648(十六進(jìn)制形式:-0x80000000)是除了最左邊為1外,其他比特位都為0的整數(shù)。

-2147483648 (base 10) = 10000000000000000000000000000000 (base 2)

2147483647(十六進(jìn)制形式:0x7fffffff)是除了最左邊為0外,其他比特位都為1的整數(shù)。

2147483647 (base 10) = 01111111111111111111111111111111 (base 2)

數(shù)字-2147483648 和 2147483647 是32位有符號(hào)數(shù)字所能表示的最小和最大整數(shù)。

按位邏輯操作符

從概念上講,按位邏輯操作符按遵守下面規(guī)則:

  • 操作數(shù)被轉(zhuǎn)換成32位整數(shù),用比特序列(0和1組成)表示。
  • 第一個(gè)操作數(shù)的每個(gè)比特位與第二個(gè)操作數(shù)的相應(yīng)比特位匹配:第一位對(duì)應(yīng)第一位,第二位對(duì)應(yīng)第二位,以此類(lèi)推。
  • 位運(yùn)算符應(yīng)用到每對(duì)比特位,結(jié)果是新的比特值。

按位操作符(Bitwise operators) 將其操作數(shù)(operands)當(dāng)作32位的比特序列(由0和1組成),而不是十進(jìn)制、十六進(jìn)制或八進(jìn)制數(shù)值。例如,十進(jìn)制數(shù)9,用二進(jìn)制表示則為1001。按位操作符操作數(shù)字的二進(jìn)制形式,但是返回值依然是標(biāo)準(zhǔn)的JavaScript數(shù)值。

下面的表格總結(jié)了JavaScript中的按位操作符:

運(yùn)算符 用法 描述
按位與( AND) a & b 對(duì)于每一個(gè)比特位,只有兩個(gè)操作數(shù)相應(yīng)的比特位都是1時(shí),結(jié)果才為1,否則為0。
按位或(OR) a | b 對(duì)于每一個(gè)比特位,當(dāng)兩個(gè)操作數(shù)相應(yīng)的比特位至少有一個(gè)1時(shí),結(jié)果為1,否則為0。
按位異或(XOR) a ^ b 對(duì)于每一個(gè)比特位,當(dāng)兩個(gè)操作數(shù)相應(yīng)的比特位有且只有一個(gè)1時(shí),結(jié)果為1,否則為0。
按位非(NOT) ~ a 反轉(zhuǎn)操作數(shù)的比特位,即0變成1,1變成0。
左移(Left shift) a << b a 的二進(jìn)制形式向左移 b (< 32) 比特位,右邊用0填充。
有符號(hào)右移 a >> b 將 a 的二進(jìn)制表示向右移b(< 32) 位,保留符號(hào)位(即正負(fù)號(hào)標(biāo)記)。
無(wú)符號(hào)右移 a >>> b 將 a 的二進(jìn)制表示向右移b(< 32) 位,丟棄被移出的位,并使用 0 在左側(cè)填充。

布爾操作符

布爾操作符一共有以下3個(gè):

  1. 邏輯非(not)(!)
  2. 與(and)(&&)
  3. 或(or)(||)

邏輯非(!)

邏輯非操作符由一個(gè)嘆號(hào)(!)表示,可以用于任何值。無(wú)論這個(gè)值是什么數(shù)據(jù)類(lèi)型,這個(gè)操作符都會(huì)返回一個(gè)布爾值。

邏輯非操作符遵循下列規(guī)則:

  • 如果操作數(shù)是一個(gè)對(duì)象,返回false;
  • 如果操作數(shù)是一個(gè)空字符串,返回true;
  • 如果操作數(shù)是一個(gè)非空字符串,返回false;
  • 如果操作數(shù)是數(shù)值0,返回true;
  • 如果操作時(shí)是任意非0數(shù)值,(包括infinity),返回false;
  • 如果操作數(shù)是null,返回true;
  • 如果操作數(shù)是NaN,返回true;
  • 如果操作數(shù)是underfined,返回true。

例如:


  var a = {
    function(){
      return 1;
    }
  };
  console.log(!a);              //false
  console.log(!"");             //true
  console.log(!"hello world"); //false
  console.log(!0);             //true
  console.log(!2017);          //false
  console.log(!null);          //true
  console.log(!NaN);                   //true

如果同時(shí)使用兩個(gè)邏輯非操作符,可以得到這個(gè)值對(duì)應(yīng)的布爾值。

邏輯與(&&)

邏輯與操作符由 && 表示,有兩個(gè)操作數(shù),如:

var result = true && false;

其值表為:

第一個(gè)操作符 第二個(gè)操作符 結(jié)果
true true true
true flase false
false true false
false flase false

邏輯與操作符可以應(yīng)用于任何類(lèi)型的操作數(shù)。

邏輯與操作符遵循下列規(guī)則:

  • 如果第一個(gè)操作數(shù)是對(duì)象,則返回第二個(gè)操作數(shù);
  • 如果第二個(gè)操作數(shù)是對(duì)象,則只有在第一個(gè)操作數(shù)的求值結(jié)果為true的情況下才會(huì)返回該對(duì)象;
  • 如果兩個(gè)操作數(shù)都是對(duì)象,則返回第二個(gè)操作數(shù);
  • 如果有一個(gè)操作數(shù)是null,返回null;
  • 如果有一個(gè)操作數(shù)是NaN,返回NaN;
  • 如果有一個(gè)操作數(shù)是underfined,返回underfined。

如果第一個(gè)操作數(shù)是false,無(wú)論第二個(gè)操作數(shù)是什么值,結(jié)果都為false。

邏輯或(||)

邏輯或操作符由 || 表示,有兩個(gè)操作數(shù),如:

var result = true || false;

其值表為:

第一個(gè)操作符 第二個(gè)操作符 結(jié)果
true true true
true flase true
false true true
false flase false

邏輯與操作符遵循下列規(guī)則:

  • 如果第一個(gè)操作數(shù)是對(duì)象,則返回第一個(gè)操作數(shù);
  • 如果第一個(gè)操作數(shù)的求值結(jié)果為false,則返回第二個(gè)操作數(shù);
  • 如果兩個(gè)操作數(shù)都是對(duì)象,則返回第一個(gè)操作數(shù);
  • 如果有一個(gè)操作數(shù)是null,返回null;
  • 如果有一個(gè)操作數(shù)是NaN,返回NaN;
  • 如果有一個(gè)操作數(shù)是underfined,返回underfined。

如果第一個(gè)操作數(shù)是true,無(wú)論第二個(gè)操作數(shù)是什么值,結(jié)果都為true。

乘性操作符

3個(gè)乘性操作符:

  1. 乘法;
  2. 除法;
  3. 求模。

如果參與乘性計(jì)算的某個(gè)操作符不是數(shù)值,后臺(tái)會(huì)先使用number()轉(zhuǎn)型函數(shù)將其轉(zhuǎn)換為數(shù)值。

乘法

乘法操作符由一個(gè) * 表示,用于計(jì)算兩個(gè)數(shù)值的乘積。

乘法操作符遵循下列規(guī)則:

  1. 數(shù)值 * 數(shù)值,執(zhí)行常規(guī)乘法計(jì)算;
  2. x * NaN,結(jié)果為NaN;
  3. Infinity * 0,結(jié)果為NaN;
  4. Infinity * y(y不等于0),結(jié)果為+-Infinity;
  5. Infinity * Infinity,結(jié)果為Infinity。

除法

除法操作符由一個(gè) / 表示,執(zhí)行兩個(gè)數(shù)值的除法運(yùn)算。

除法操作符遵循下列規(guī)則:

  1. 數(shù)值 / 數(shù)值,執(zhí)行常規(guī)除法計(jì)算;
  2. x / NaN,結(jié)果為NaN;
  3. 0 / 0,結(jié)果為NaN;
  4. 非零有限數(shù) / 0,結(jié)果為+-Infinity;
  5. Infinity / Infinity,結(jié)果為結(jié)果為NaN;
  6. Infinity / 任何非零數(shù),結(jié)果為+-Infinity。

求模

求模(余數(shù))操作符由一個(gè) % 表示。

求模操作符遵循下列規(guī)則:

  1. 數(shù)值 % 數(shù)值,執(zhí)行常規(guī)求模計(jì)算;
  2. 無(wú)窮大值 % 有限大值,結(jié)果為NaN;
  3. 有限大值 % 0,結(jié)果為NaN;
  4. Infinity % Infinity,結(jié)果為NaN;
  5. 有限大值 % 無(wú)窮大值,結(jié)果為有限大值;
  6. 0 % 任何數(shù),結(jié)果為0。

加性運(yùn)算符

加法

加法操作符由一個(gè) + 表示。

加法操作符遵循下列規(guī)則:

  • 在兩個(gè)操作數(shù)都是數(shù)字的時(shí)候,會(huì)做加法運(yùn)算
  • 兩個(gè)參數(shù)都是字符串或在有一個(gè)參數(shù)是字符串的情況下會(huì)把另外一個(gè)參數(shù)轉(zhuǎn)換為字符串做字符串拼接
  • 在參數(shù)有對(duì)象的情況下會(huì)調(diào)用其valueOf或toString
  • 在只有一個(gè)字符串參數(shù)的時(shí)候會(huì)嘗試將其轉(zhuǎn)換為數(shù)字
  • 在只有一個(gè)數(shù)字參數(shù)的時(shí)候返回其正數(shù)值
  var a = 5;
  var b = 10;
  console.log("5加10的值為:" + a + b);   //5加10的值為:510
  console.log("5加10的值為:" + (a + b));         //5加10的值為:15

減法

加法操作符由一個(gè) - 表示。

加法操作符遵循下列規(guī)則:

  1. x - NaN,結(jié)果為NaN;
  2. Infinity - Infinity,結(jié)果為NaN;
  3. -Infinity - -Infinity,結(jié)果為NaN;
  4. Infinity - -Infinity,結(jié)果為Infinity;
  5. -Infinity - Infinity,結(jié)果為-Infinity;
  6. +0 - +0 = +0;
  7. +0 - -0 = -0;
  8. -0 - -0 = +0.

關(guān)系操作符

關(guān)系操作符一共有4個(gè):

  1. 小于(<);
  2. 大于(>);
  3. 小于等于(>=);
  4. 大于等于(>=)。

關(guān)系操作符遵循下列規(guī)則:

  1. 如果兩個(gè)操作數(shù)都是數(shù)值,執(zhí)行數(shù)值比較;
  2. 如果兩個(gè)操作符都是字符串,執(zhí)行兩個(gè)字符串對(duì)應(yīng)的字符編碼值比較;
  3. 如果兩個(gè)操作符其中一個(gè)是數(shù)值,將另一個(gè)轉(zhuǎn)換為數(shù)值再進(jìn)行比較;
  4. 如果兩個(gè)操作符其中一個(gè)是布爾值,將其轉(zhuǎn)換為數(shù)值再進(jìn)行比較。
  var a = "Brick";
  var b = "alphabet";
  console.log(a < b);                                 //true
  console.log(a.toLowerCase() < b.toLowerCase());    //false

相等操作符

相等和不相等

先轉(zhuǎn)換再比較

相等操作符由 == 表示;

不相等操作符由 != 表示。

相等操作符遵循下列規(guī)則:

  1. 如果包含布爾值:將false轉(zhuǎn)換為0,true轉(zhuǎn)換為1;
  2. 如果包含字符串和數(shù)值,將字符串轉(zhuǎn)換為數(shù)值;
  3. 如果一個(gè)操作符石對(duì)象,另一個(gè)不是則遵循:
  • null == underfined;
  • 比較之前,不能將null和underfined轉(zhuǎn)換為其他任何值;
  • 如果有一個(gè)操作數(shù)是NaN,相等操作符返回false,不相等操作符返回true;
  • NaN == NaN,相等操作符返回false,不相等操作符返回true;
  • 如果兩個(gè)操作數(shù)都是對(duì)象,則比較她們是不是同一個(gè)對(duì)象。

全等和不全等

僅比較不轉(zhuǎn)換

全等操作符由 === 表示;

不全等操作符由 !== 表示。

null == underfined,返回true;

null === underfined,返回false,因?yàn)樗鼈兪遣煌?lèi)型的值。

條件操作符

語(yǔ)法

condition ? expr1 : expr2

參數(shù)

condition:計(jì)算結(jié)果為true或false的表達(dá)式。

expr1, expr2:值可以是任何類(lèi)型的表達(dá)式。

描述
如果條件值為真值(true),運(yùn)算符就會(huì)返回 expr1 的值;否則, 就會(huì)返回 expr2 的值。

  var a = 13;
  var b = 16;
  var max = (a > b) ? a : b;
  console.log(max);          //返回值為16

賦值操作符

賦值操作符由 = 表示。

簡(jiǎn)單賦值操作:

  var age = 18;

復(fù)合賦值(在 = 前面添加其他操作符)操作:

  var age = 18;
      age += 10;
      //等同于
      age = age + 10;

逗號(hào)操作符

使用逗號(hào)操作符可以在一條語(yǔ)句中執(zhí)行多個(gè)操作,如:

//逗號(hào)操作符用于聲明多個(gè)變量
  var a = 1, b = 2, c = 3;
//逗號(hào)操作符用于賦值
  var a = (1,2,3,4);
//由于4是表達(dá)式中的最后一項(xiàng),因此a的值就是4

運(yùn)算符優(yōu)先級(jí)匯總表

Operator precedence

練習(xí)

// Number + Number -> 數(shù)字相加
console.log(1+1);       //2

// String + String -> 字符串連接
console.log("2"+"4");   //"24"

// Number + String -> 字符串連接
console.log(2+"4");     //"24"

// 只有一個(gè)字符串參數(shù) -> 數(shù)值
console.log(+"4");      //4
var a = 1;
a+++a;
//  a+++a -> (a++)+a,a++返回值為1,a自增運(yùn)算結(jié)果為2,即1+2=3
typeof a+2;
//  typeof a+2 -> (typeof a)+2,typeof a返回值為number,即number+2="number2"
var a = 1;
var b = 3;
console.log( a+++b );
//  a+++b -> (a++)+b,a++返回值為1,即1+3=4
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 表達(dá)式 表達(dá)式是由數(shù)字、運(yùn)算符、數(shù)字分組符號(hào)(如括號(hào))、自由變量和約束變量等以能求得數(shù)值的有意義排列方法所得的組合...
    劼哥stone閱讀 645評(píng)論 0 4
  • 1、標(biāo)識(shí)符 標(biāo)識(shí)符是指變量、函數(shù)、屬性的名字,或函數(shù)的參數(shù)。 格式規(guī)則: 第一個(gè)字符必須是一個(gè)字母、下劃線(xiàn)(_)或...
    霜天曉閱讀 758評(píng)論 0 0
  • 小時(shí)候 我不記得父親是什么樣子 只知道 家里有個(gè)與母親熟識(shí)的男人 男人來(lái)去匆匆 我短手短腳追不上 后來(lái)啊 我獨(dú)自走...
    夏光草木閱讀 155評(píng)論 0 6
  • 進(jìn)程 什么是進(jìn)程進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專(zhuān)用且受保護(hù)的內(nèi)存空...
    為自己丶拼個(gè)未來(lái)閱讀 311評(píng)論 0 1

友情鏈接更多精彩內(nèi)容