當(dāng)前位置:首頁 > IT技術(shù) > 編程語言 > 正文

javaScript系列 [17]-運(yùn)算符
2022-01-01 23:22:26

本文將介紹javaScript語言中的運(yùn)算符(operator),包括但不限于算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符以及賦值運(yùn)算符等內(nèi)容,而對(duì)于位運(yùn)算符及關(guān)鍵字運(yùn)算符則僅會(huì)做簡(jiǎn)單說明。

運(yùn)算符簡(jiǎn)介

JavaScript語言中的運(yùn)算符如果按照符號(hào)來劃分那么總體可以分成標(biāo)點(diǎn)符號(hào)所表示的運(yùn)算符關(guān)鍵字運(yùn)算符兩大類,其中前者指代的是類似于+、*&&、==等運(yùn)算符,而后者指代的是類似于in、delete、typeof以及instanceof的運(yùn)算符。需要說明的是,本文只介紹前者,也就是所謂標(biāo)點(diǎn)符號(hào)所表示的運(yùn)算符

其實(shí),如果按照運(yùn)算符的作用和具體使用方式來劃分,又可以分成如上圖所示的基本算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、賦值運(yùn)算符等幾種,而這也是開發(fā)中習(xí)慣的分類方式。聽上去感覺非常繁雜甚至讓人害怕,其實(shí) enmmm ~ 大可不必 ** : )**

運(yùn)算符基本使用

接下來,我將分別介紹JavaScript中各種類型的運(yùn)算符,包括它們都有哪些具體的運(yùn)算符,應(yīng)該如何使用,使用的示例代碼以及額外的注意點(diǎn)等(位運(yùn)算符不在本文說明的范圍,有興趣的朋友可以參考 數(shù)據(jù)安全系列 XOR 這篇文章。

基本算術(shù)運(yùn)算符

在這里我們先介紹基本的算術(shù)運(yùn)算符,它們是 *(乘法)、/(除法)、+(加法)、-(減法)和 %(求余|模運(yùn)算)。這些運(yùn)算符中,除了+(加法)稍微復(fù)雜點(diǎn)外,其余的四種運(yùn)算符都很簡(jiǎn)單,就是簡(jiǎn)單的求積、求商、差以及余數(shù)。

  var num1 = 8,num2 = 26;

  /*基本的算術(shù)運(yùn)算符*/
  console.log(num1 + num2);     //34
  console.log(num2 - num1);     //18
  console.log(num1 - num2);     //-18
  console.log(num1 * num2);     //208
  console.log(num1 / num2);     //0.3076923076923077
  console.log(num2 / num1);     //3.25
  console.log(num2 % num1);     //2
  console.log(num1 % num2);     //8

算術(shù)運(yùn)算符的使用注意點(diǎn)說明

① 除加法外,其他運(yùn)算符在必要時(shí)會(huì)將操作數(shù)轉(zhuǎn)換為數(shù)字,如無法轉(zhuǎn)換則結(jié)果為NaN
② 除數(shù)為0的結(jié)果為正無窮大或者是負(fù)無窮大,而0/0的結(jié)果是NaN。
③ 模(%)運(yùn)算中,計(jì)算的結(jié)果和第一個(gè)操作數(shù)的符號(hào)保持一致,且模運(yùn)算也適用于整數(shù)和浮點(diǎn)數(shù)。
④ 加法(+)可以對(duì)兩個(gè)數(shù)字做加法,也可以用來連接字符串,具體的情況可以參考下面的示例代碼。

  /*算術(shù)運(yùn)算符的使用注意點(diǎn)*/
  /*01 默認(rèn)把非數(shù)字轉(zhuǎn)換為數(shù)字,如果無法轉(zhuǎn)換則轉(zhuǎn)換為NaN,最終結(jié)果為NaN*/
  console.log("12" - 3);            //9
  console.log("12" / 3);            //4
  console.log("12a"* 3);            //NaN

  /*02 考慮0作為除數(shù)的情況*/
  console.log("12" / 0);            //Infinity   無窮大
  console.log(-12  / 0);            //-Infinity  負(fù)無窮大
  console.log( 0   / 0);            //NaN

  /*03 模運(yùn)算的符號(hào)問題,以及在浮點(diǎn)數(shù)中的應(yīng)用*/
  console.log("12"  % 1  );         //0
  console.log("-12" % 5  );         //-2
  console.log("-12" % -5 );         //-2  模運(yùn)算結(jié)果的符號(hào)只和第一個(gè)操作數(shù)相關(guān)
  console.log( 6.5  % 2.1);         //0.19999999999999973

  /*04 加法用來拼接字符串的用法和注意點(diǎn)*/
  console.log(1 + 2);               //3
  console.log("Hi" + " XiaoXia");   //"Hi XiaoXia"
  console.log("2"  + "3");          //"23"
  console.log("2"  +  3 );          //"23"
  console.log( 2   + "3");          //"23"
  console.log( 1   + 2 + "Nice" );  //"3Nice"
  console.log( 1   + (2 + "Nice")); //"12Nice"
  console.log("Nice" + 1 + 2);      //"Nice12"

  console.log(true + true);         //2 布爾類型的值轉(zhuǎn)換為數(shù)字1后再做加法
  console.log(true + false);        //1
  console.log(41   + null);         //41  null轉(zhuǎn)換為數(shù)字0后再做加法
  console.log(41   + undefined);    //NaN undefined轉(zhuǎn)換為數(shù)字(NaN)后做加法

特別說明 處理+運(yùn)算符的時(shí)候,如果操作數(shù)都是數(shù)字那就做加法計(jì)算,如果都是字符串那就拼接,如果是此外的其他情況,那運(yùn)算是默認(rèn)會(huì)執(zhí)行必要的類型轉(zhuǎn)換,而運(yùn)算符的行為依賴于類型轉(zhuǎn)換的結(jié)果,加號(hào)的轉(zhuǎn)換規(guī)則需要優(yōu)先考慮字符串連接。

關(guān)系運(yùn)算符

關(guān)系運(yùn)算符 用于測(cè)試兩個(gè)值之間的關(guān)系,比如"相等"、"大于"等,根據(jù)關(guān)系是否存在(成立)而返回 true 或者是 false。關(guān)系表達(dá)式總是返回一個(gè)布爾值,通常用在if、while以及for語句中用于控制程序的執(zhí)行流程。下面將依次介紹關(guān)系運(yùn)算符中的比較運(yùn)算符(<、<=、>、>=) 和 (不)相(全)等運(yùn)算符。

比較運(yùn)算符 用來檢測(cè)兩個(gè)操作數(shù)的大小關(guān)系(數(shù)值大小或者字母表的順序)。需要注意JavaScript字符串是一個(gè)由16位整數(shù)值組成的序列,字符串的比較本質(zhì)上是對(duì)兩個(gè)字符串中的字符對(duì)應(yīng)的數(shù)值進(jìn)行比較,而且字符串比較是區(qū)分大小寫的,所有的大寫的ASCII字母都"小于"小寫的ASCII字母,點(diǎn)擊查看ASCII表。

  /*比較運(yùn)算符的簡(jiǎn)單使用:返回值均為布爾值*/
  /*01-兩個(gè)操作符都是數(shù)字的情況*/
  console.log(1  <  3 );        //true
  console.log(12 <  4 );        //false
  console.log(1  <= 3 );        //true
  console.log(65 >  41);        //true
  console.log(65 >= 41);        //true

  /*02-兩個(gè)操作符都是字符串的情況*/
  console.log("a"  <  "b"  );   //true  "a"-97 "b"-98
  console.log("a"  <  "ba" );   //true  比較第一位
  console.log("ab" >  "ac" );   //false 比較第二位 b-98 c-99
  console.log("abc"<  "abx");   //true  比較第三位 c-99 x-120
  console.log("1"  >  "2" );    //false "1"-49 "2"-50
  console.log("A"  >  "a" );    //false "A"-65 "a"-97

比較運(yùn)算符 的操作數(shù)可以是任意類型的,但只有 數(shù)字和字符串才能真正的執(zhí)行比較操作 ,其它的操作都將進(jìn)行類型轉(zhuǎn)換。在進(jìn)行類型轉(zhuǎn)換的時(shí)候,比較運(yùn)算符更偏愛數(shù)字所以會(huì)優(yōu)先把操作數(shù)都轉(zhuǎn)換為數(shù)字再比較,只有當(dāng)兩個(gè)操作數(shù)都是字符串的時(shí)候才會(huì)進(jìn)行字符串的比較( 字母表順序 )。

  /*如果比較運(yùn)算符的兩個(gè)操作數(shù)類型不都是字符串和數(shù)字的情況~*/
  console.log("a"  >  0 );       //false  "a"轉(zhuǎn)換為NaN
  console.log(100  > "c");       //false  "c"轉(zhuǎn)換為NaN
  console.log("12" >  10);       //true   "12"轉(zhuǎn)換為數(shù)字12
  console.log(10   > undefined); //false   undefined轉(zhuǎn)換為NaN
  console.log(10   > null);      //true    null轉(zhuǎn)換為0
  console.log(-1   > null);      //false   

簡(jiǎn)單總結(jié)下,如果比較運(yùn)算符的兩個(gè)操作數(shù)類型不同(不全是數(shù)字或者不全是字符串)的時(shí)候,會(huì)優(yōu)先把操作數(shù)轉(zhuǎn)換為數(shù)字。如果操作數(shù)中出現(xiàn)NaN(無論是類型轉(zhuǎn)換前還是轉(zhuǎn)換后),最終結(jié)果都將是NaN。

相等()和全等(=)運(yùn)算符 用于比較兩個(gè)值是否相等或全等,如果滿足則返回 true。其實(shí)相等()和全等(=)的核心區(qū)別在于相等僅比較值,而全等需要比較值和類型。

  /*相等:僅僅比較值,如果類型不同那么會(huì)進(jìn)行類型轉(zhuǎn)換(限于字符串、布爾值和對(duì)象),優(yōu)先轉(zhuǎn)換為數(shù)字*/
  console.log( 1   == 1);         //true
  console.log("1"  == 1);         //true   "1"先被轉(zhuǎn)換為數(shù)字1
  console.log("1a" == 1);         //false  "1a"先被轉(zhuǎn)換為數(shù)字這里得到的是NaN
  console.log(true == 1);         //true   true先被轉(zhuǎn)換為數(shù)字1
  console.log(true == "1");       //true   true先被轉(zhuǎn)換為數(shù)字1,"1"被轉(zhuǎn)換為數(shù)字1

  console.log(NaN  == NaN);       //false  NaN和任何的值都不等包括它自己
  console.log(null == undefined); //true   比較特殊(因?yàn)楸举|(zhì)上undefined派生自null)

  /*需要注意:undefined和null在和數(shù)字比較的時(shí)候并不會(huì)轉(zhuǎn)換成NaN和0*/
  console.log(0    == undefined); //false
  console.log(0    == null);      //false

  /*全等:也稱為嚴(yán)格相等,既比較值也比較類型,類型不同則直接返回false*/
  console.log("1"  === 1);         //false  類型不同
  console.log(true === 1);         //false  類型不同
  console.log(null === undefined); //false  類型不同

說明 需要注意區(qū)分"=="(相等)、"==="(全等)"="(賦值),此外還有"!=""!=="運(yùn)算符,它們的檢測(cè)規(guī)則剛好是 相等全等 的求反。

邏輯運(yùn)算符

圖示已經(jīng)列出了JavaScript語言中的三種邏輯運(yùn)算符("邏輯非"、"邏輯或""邏輯與")以及它們的具體使用方式,在開發(fā)中邏輯運(yùn)算符常用在條件表達(dá)式中(如if語句的條件判斷),下面給出參考代碼。

  /*01-邏輯非 該運(yùn)算符只有一個(gè)操作數(shù),作用是對(duì)操作數(shù)取反*/
  console.log(!true);             //false
  console.log(!0);                //true
  console.log(!undefined);        //true

  /*02-邏輯或 該運(yùn)算符需要兩個(gè)操作數(shù)
  * 運(yùn)算規(guī)則:如果第一個(gè)操作數(shù)為真那么就直接返回第一個(gè)操作數(shù),否則返回第二個(gè)操作數(shù)
  */
  console.log(   0 || 1);        //1
  console.log(true || false);    //true 返回操作數(shù)1
  console.log(   1 || 2);        //1    返回操作數(shù)1
  console.log(   2 || 4);        //2    返回操作數(shù)1
  console.log(  "" || 5);        //5    第一個(gè)操作數(shù)轉(zhuǎn)換為false,返回第二個(gè)操作數(shù)
  console.log( 1>2 || "Hi");     //Hi"

  /*03-邏輯與 該運(yùn)算符需要兩個(gè)操作數(shù)
  * 運(yùn)算規(guī)則:如果第一個(gè)操作數(shù)為真那么就直接返回第二個(gè)操作數(shù),否則返回第一個(gè)操作數(shù)
  */
  console.log(   0 && 1);        //0
  console.log(true && false);    //false 返回操作數(shù)2
  console.log(   1 && 2);        //2     返回操作數(shù)2
  console.log(   2 && 4);        //4     返回操作數(shù)2
  console.log(  "" && 5);        //""
  console.log( 1>2 && "Hi");     //false

其它常用運(yùn)算符

在最后,再簡(jiǎn)單介紹JavaScript語言中的賦值運(yùn)算符、自增自減運(yùn)算符以及特殊的三元運(yùn)算符。

賦值運(yùn)算符 JavaScript使用=運(yùn)算符來給變量賦值,該運(yùn)算符希望它的左操作數(shù)是一個(gè)左值(一個(gè)變量或者是對(duì)象屬性),而它的右操作數(shù)可以是任意類型的任意值。需要注意的是,=的優(yōu)先級(jí)很低,且它的結(jié)合性是從右至左(即如果一個(gè)表達(dá)式中出現(xiàn)了多個(gè)賦值運(yùn)算符,那么運(yùn)算的順序是從右至左的)。

var a = 8.26;             //將變量a的值設(shè)置為8.26
    a = "Xia";            //二次賦值
    
var i,j=k=o=408;          //把j、k、o三個(gè)變量初始化為408
console.log(i, j, k,o);   //undefined 408 408 408

帶操作的賦值運(yùn)算符 主要有+=-=、*=、/=以及%=等,當(dāng)然還包括<<=等位操作符和賦值操作符的組合(此文不涉及位操作符)。這里列出的這些運(yùn)算符它們其實(shí)是算術(shù)運(yùn)算符和賦值運(yùn)算符的組合,是一種常用的簡(jiǎn)寫形式,下面給出示例代碼。

  var a = 1,b = 2;
  console.log(a += b);  //等價(jià)于 a = a + b    3 (這是a更新后的值)
  console.log(a -= b);  //等價(jià)于 a = a - b    1
  console.log(a *= b);  //等價(jià)于 a = a * b    2
  console.log(a /= b);  //等價(jià)于 a = a / b    1
  console.log(a %= b);  //等價(jià)于 a = a % b    1

現(xiàn)在,我們來看開發(fā)中經(jīng)常使用的自增(++i或i++)自減(--i或i--)運(yùn)算符,它們的作用是在當(dāng)前值的基礎(chǔ)上+1或者是-1,而++ii++對(duì)于i這個(gè)變量本身而言沒區(qū)別,它們的區(qū)別在于如果有涉及返回值的操作,那么++i的更新會(huì)體現(xiàn)在返回值中(換句話說就是先對(duì)變量的+1,然后把結(jié)果返回),而i++則不會(huì)(先把i返回,然后再執(zhí)行變量的+1操作),自減運(yùn)算符同理。

  /*說明:i++ 等價(jià)于 i = i + 1*/
  var i  = 0;
  var r1 = i++;     //先把i的值賦值給r1,然后在執(zhí)行i+1
  console.log(i);   //1
  console.log(r1);  //0

  var j  = 0;
  var r2 = ++j;     //先執(zhí)行j+1,然后把j+1的值賦值給r2
  console.log(j)    //1
  console.log(r2);  //1

  /*思考:var k = 0; console.log(k++ + ++k + k  + k++);*/

條件運(yùn)算符( ? : ) 也被稱為三元運(yùn)算符,因?yàn)樵撨\(yùn)算符需要三個(gè)操作數(shù),語法為**條件表達(dá)式?表達(dá)式1:表達(dá)式2**,其運(yùn)算的規(guī)則是檢查條件表達(dá)式的值,如果該值為真則返回表達(dá)式1,否則返回表達(dá)式2。

var a = 1 < 2 ? "小于" : "大于";              //條件表達(dá)式1<2的結(jié)果為真(true)
console.log(a);     //小于

var b = (1 < 2) && (3 > 5) ? "看書" : "睡覺";//條件表達(dá)式的結(jié)果為真(false)
console.log(b);    //睡覺

運(yùn)算符的優(yōu)先級(jí)備注 我們?cè)诰帉慗avaScript表達(dá)式的時(shí)候,需要注意運(yùn)算符是有優(yōu)先級(jí)的,譬如var a = x + y * b;這行代碼,因?yàn)?乘法運(yùn)算符比 加法運(yùn)算符的優(yōu)先級(jí),其次是等號(hào)賦值運(yùn)算符,因此其執(zhí)行順序是先計(jì)算 y * b,然后再 + x的值,最終才把結(jié)果賦值給a。在開發(fā)中,我們可以通過圓括號(hào)來強(qiáng)行指定運(yùn)算順序。如果var a = (x + y) * b;這樣寫代碼,那么就先加再乘最后才進(jìn)行賦值操作。

本文摘自 :https://www.cnblogs.com/

開通會(huì)員,享受整站包年服務(wù)立即開通 >