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

javaScript系列 [17]-運算符
2022-01-01 23:22:26

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

運算符簡介

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

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

運算符基本使用

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

基本算術(shù)運算符

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

  var num1 = 8,num2 = 26;

  /*基本的算術(shù)運算符*/
  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ù)運算符的使用注意點說明

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

  /*算術(shù)運算符的使用注意點*/
  /*01 默認把非數(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  負無窮大
  console.log( 0   / 0);            //NaN

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

  /*04 加法用來拼接字符串的用法和注意點*/
  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)后做加法

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

關(guān)系運算符

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

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

  /*比較運算符的簡單使用:返回值均為布爾值*/
  /*01-兩個操作符都是數(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-兩個操作符都是字符串的情況*/
  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

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

  /*如果比較運算符的兩個操作數(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é)下,如果比較運算符的兩個操作數(shù)類型不同(不全是數(shù)字或者不全是字符串)的時候,會優(yōu)先把操作數(shù)轉(zhuǎn)換為數(shù)字。如果操作數(shù)中出現(xiàn)NaN(無論是類型轉(zhuǎn)換前還是轉(zhuǎn)換后),最終結(jié)果都將是NaN。

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

  /*相等:僅僅比較值,如果類型不同那么會進行類型轉(zhuǎn)換(限于字符串、布爾值和對象),優(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   比較特殊(因為本質(zhì)上undefined派生自null)

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

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

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

邏輯運算符

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

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

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

  /*03-邏輯與 該運算符需要兩個操作數(shù)
  * 運算規(guī)則:如果第一個操作數(shù)為真那么就直接返回第二個操作數(shù),否則返回第一個操作數(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

其它常用運算符

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

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

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

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

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

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

  /*說明:i++ 等價于 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++);*/

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

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

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

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

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

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