JavaScript操作符

一元操作符

只能操作一個值的操作符。

遞增和遞減操作符

  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í)行前置遞增和遞減操作時,變量的值都在語句被求值前改變嘉蕾。

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

后置型遞增和遞減操作是在包含她們的語句被求值之后才執(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)用于浮點數(shù)值,執(zhí)行遞增和遞減操作障贸;
  • 如果應(yīng)用于對象错森,先調(diào)用對象的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

一元加和減操作符

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

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

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

位操作符

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

有符號32位整數(shù)

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

所有的按位操作符的操作數(shù)都會被轉(zhuǎn)成補(bǔ)碼(two's complement)形式的有符號32位整數(shù)该面。補(bǔ)碼形式是指一個數(shù)的負(fù)對應(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)一個數(shù)是正數(shù)時桥嗤,其最左的比特位是0,當(dāng)一個數(shù)是負(fù)數(shù)時仔蝌,其最左的比特位是1泛领。因此,最左邊的比特位被稱為符號位(sign bit)敛惊。

0 是所有比特數(shù)字0組成的整數(shù)渊鞋。

0 (base 10) = 00000000000000000000000000000000 (base 2)

-1 是所有比特數(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位有符號數(shù)字所能表示的最小和最大整數(shù)执俩。

按位邏輯操作符

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

  • 操作數(shù)被轉(zhuǎn)換成32位整數(shù)癌刽,用比特序列(0和1組成)表示爵川。
  • 第一個操作數(shù)的每個比特位與第二個操作數(shù)的相應(yīng)比特位匹配:第一位對應(yīng)第一位枚驻,第二位對應(yīng)第二位,以此類推。
  • 位運(yùn)算符應(yīng)用到每對比特位价说,結(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 對于每一個比特位蛤迎,只有兩個操作數(shù)相應(yīng)的比特位都是1時,結(jié)果才為1含友,否則為0替裆。
按位或(OR) a | b 對于每一個比特位,當(dāng)兩個操作數(shù)相應(yīng)的比特位至少有一個1時窘问,結(jié)果為1辆童,否則為0。
按位異或(XOR) a ^ b 對于每一個比特位惠赫,當(dāng)兩個操作數(shù)相應(yīng)的比特位有且只有一個1時把鉴,結(jié)果為1,否則為0儿咱。
按位非(NOT) ~ a 反轉(zhuǎn)操作數(shù)的比特位庭砍,即0變成1,1變成0混埠。
左移(Left shift) a << b a 的二進(jìn)制形式向左移 b (< 32) 比特位怠缸,右邊用0填充。
有符號右移 a >> b 將 a 的二進(jìn)制表示向右移b(< 32) 位钳宪,保留符號位(即正負(fù)號標(biāo)記)揭北。
無符號右移 a >>> b 將 a 的二進(jìn)制表示向右移b(< 32) 位,丟棄被移出的位吏颖,并使用 0 在左側(cè)填充搔体。

布爾操作符

布爾操作符一共有以下3個:

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

邏輯非(!)

邏輯非操作符由一個嘆號(!)表示,可以用于任何值侦高。無論這個值是什么數(shù)據(jù)類型嫉柴,這個操作符都會返回一個布爾值。

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

  • 如果操作數(shù)是一個對象奉呛,返回false计螺;
  • 如果操作數(shù)是一個空字符串,返回true瞧壮;
  • 如果操作數(shù)是一個非空字符串登馒,返回false;
  • 如果操作數(shù)是數(shù)值0咆槽,返回true陈轿;
  • 如果操作時是任意非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

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

邏輯與(&&)

邏輯與操作符由 && 表示钩述,有兩個操作數(shù)寨躁,如:

var result = true && false;

其值表為:

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

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

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

  • 如果第一個操作數(shù)是對象牙勘,則返回第二個操作數(shù)职恳;
  • 如果第二個操作數(shù)是對象,則只有在第一個操作數(shù)的求值結(jié)果為true的情況下才會返回該對象谜悟;
  • 如果兩個操作數(shù)都是對象话肖,則返回第二個操作數(shù)北秽;
  • 如果有一個操作數(shù)是null葡幸,返回null;
  • 如果有一個操作數(shù)是NaN贺氓,返回NaN蔚叨;
  • 如果有一個操作數(shù)是underfined,返回underfined辙培。

如果第一個操作數(shù)是false蔑水,無論第二個操作數(shù)是什么值,結(jié)果都為false扬蕊。

邏輯或(||)

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

var result = true || false;

其值表為:

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

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

  • 如果第一個操作數(shù)是對象尾抑,則返回第一個操作數(shù)歇父;
  • 如果第一個操作數(shù)的求值結(jié)果為false,則返回第二個操作數(shù)再愈;
  • 如果兩個操作數(shù)都是對象榜苫,則返回第一個操作數(shù);
  • 如果有一個操作數(shù)是null翎冲,返回null垂睬;
  • 如果有一個操作數(shù)是NaN,返回NaN;
  • 如果有一個操作數(shù)是underfined驹饺,返回underfined钳枕。

如果第一個操作數(shù)是true,無論第二個操作數(shù)是什么值赏壹,結(jié)果都為true么伯。

乘性操作符

3個乘性操作符:

  1. 乘法;
  2. 除法卡儒;
  3. 求模田柔。

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

乘法

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

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

  1. 數(shù)值 * 數(shù)值擎鸠,執(zhí)行常規(guī)乘法計算缀磕;
  2. x * NaN,結(jié)果為NaN劣光;
  3. Infinity * 0袜蚕,結(jié)果為NaN;
  4. Infinity * y(y不等于0)绢涡,結(jié)果為+-Infinity牲剃;
  5. Infinity * Infinity,結(jié)果為Infinity雄可。

除法

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

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

  1. 數(shù)值 / 數(shù)值数苫,執(zhí)行常規(guī)除法計算聪舒;
  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ù))操作符由一個 % 表示仁热。

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

  1. 數(shù)值 % 數(shù)值榜揖,執(zhí)行常規(guī)求模計算勾哩;
  2. 無窮大值 % 有限大值,結(jié)果為NaN举哟;
  3. 有限大值 % 0思劳,結(jié)果為NaN;
  4. Infinity % Infinity妨猩,結(jié)果為NaN潜叛;
  5. 有限大值 % 無窮大值,結(jié)果為有限大值壶硅;
  6. 0 % 任何數(shù)威兜,結(jié)果為0。

加性運(yùn)算符

加法

加法操作符由一個 + 表示庐椒。

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

  • 在兩個操作數(shù)都是數(shù)字的時候椒舵,會做加法運(yùn)算
  • 兩個參數(shù)都是字符串或在有一個參數(shù)是字符串的情況下會把另外一個參數(shù)轉(zhuǎn)換為字符串做字符串拼接
  • 在參數(shù)有對象的情況下會調(diào)用其valueOf或toString
  • 在只有一個字符串參數(shù)的時候會嘗試將其轉(zhuǎn)換為數(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

減法

加法操作符由一個 - 表示。

加法操作符遵循下列規(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個:

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

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

  1. 如果兩個操作數(shù)都是數(shù)值吗货,執(zhí)行數(shù)值比較泳唠;
  2. 如果兩個操作符都是字符串,執(zhí)行兩個字符串對應(yīng)的字符編碼值比較宙搬;
  3. 如果兩個操作符其中一個是數(shù)值笨腥,將另一個轉(zhuǎn)換為數(shù)值再進(jìn)行比較;
  4. 如果兩個操作符其中一個是布爾值勇垛,將其轉(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. 如果一個操作符石對象脚仔,另一個不是則遵循:
  • null == underfined舆绎;
  • 比較之前鲤脏,不能將null和underfined轉(zhuǎn)換為其他任何值吕朵;
  • 如果有一個操作數(shù)是NaN猎醇,相等操作符返回false努溃,不相等操作符返回true姑食;
  • NaN == NaN,相等操作符返回false茅坛,不相等操作符返回true音半;
  • 如果兩個操作數(shù)都是對象,則比較她們是不是同一個對象曹鸠。

全等和不全等

僅比較不轉(zhuǎn)換

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

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

null == underfined,返回true晾蜘;

null === underfined邻眷,返回false,因為它們是不同類型的值剔交。

條件操作符

語法

condition ? expr1 : expr2

參數(shù)

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

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

描述
如果條件值為真值(true)岖常,運(yùn)算符就會返回 expr1 的值驯镊;否則竭鞍, 就會返回 expr2 的值。

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

賦值操作符

賦值操作符由 = 表示偎快。

簡單賦值操作:

  var age = 18;

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

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

逗號操作符

使用逗號操作符可以在一條語句中執(zhí)行多個操作,如:

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

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

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"

// 只有一個字符串參數(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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市订雾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洼哎,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件噩峦,死亡現(xiàn)場離奇詭異,居然都是意外死亡识补,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門凭涂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人切油,你說我怎么就攤上這事“追” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵滤馍,是天一觀的道長底循。 經(jīng)常有香客問我巢株,道長,這世上最難降的妖魔是什么熙涤? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任困檩,我火速辦了婚禮那槽,結(jié)果婚禮上悼沿,老公的妹妹穿的比我還像新娘骚灸。我一直安慰自己糟趾,他們只是感情好甚牲,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丈钙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雏赦。 梳的紋絲不亂的頭發(fā)上劫笙,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天星岗,我揣著相機(jī)與錄音,去河邊找鬼伍茄。 笑死,一個胖子當(dāng)著我的面吹牛敷矫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播曹仗,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怎茫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轨蛤,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祥山,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缝呕,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡斧散,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸡捐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡箍镜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹿寨,到底是詐尸還是另有隱情,我是刑警寧澤脚草,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站馏慨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏写隶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一慕趴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鄙陡,春花似錦、人聲如沸趁矾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔓同,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斑粱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工珊佣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咒锻。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像惑艇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子滨巴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

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