本文將介紹javaScript語言中的運(yùn)算符(operator
),包括但不限于算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符以及賦值運(yùn)算符等內(nèi)容,而對于位運(yùn)算符及關(guān)鍵字運(yùn)算符則僅會做簡單說明。
運(yùn)算符簡介
JavaScript語言中的運(yùn)算符如果按照符號
來劃分那么總體可以分成標(biāo)點(diǎn)符號所表示的運(yùn)算符和關(guān)鍵字運(yùn)算符兩大類,其中前者指代的是類似于+
、*
、&&
、==
等運(yùn)算符,而后者指代的是類似于in
、delete
、typeof
以及instanceof
的運(yùn)算符。需要說明的是,本文只介紹前者,也就是所謂標(biāo)點(diǎn)符號所表示的運(yùn)算符。
其實,如果按照運(yùn)算符的作用和具體使用方式來劃分,又可以分成如上圖所示的基本算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、賦值運(yùn)算符等幾種,而這也是開發(fā)中習(xí)慣的分類方式。聽上去感覺非常繁雜甚至讓人害怕,其實 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)算符都很簡單,就是簡單的求積、求商、差以及余數(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ù)轉(zhuǎn)換為數(shù)字,如
無法轉(zhuǎn)換則結(jié)果為NaN
。
② 除數(shù)為0的結(jié)果為正無窮大或者是負(fù)無窮大,而0/0的結(jié)果是NaN
。
③ 模(%)運(yùn)算中,計算的結(jié)果和第一個操作數(shù)的符號保持一致,且模運(yùn)算也適用于整數(shù)和浮點(diǎn)數(shù)。
④ 加法(+)可以對兩個數(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)算的符號問題,以及在浮點(diǎn)數(shù)中的應(yīng)用*/
console.log("12" % 1 ); //0
console.log("-12" % 5 ); //-2
console.log("-12" % -5 ); //-2 模運(yùn)算結(jié)果的符號只和第一個操作數(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ù)字那就做加法計算,如果都是字符串那就拼接,如果是此外的其他情況,那運(yùn)算是默認(rèn)會執(zhí)行必要的類型轉(zhuǎn)換,而運(yùn)算符的行為依賴于類型轉(zhuǎn)換的結(jié)果,加號的轉(zhuǎn)換規(guī)則需要優(yōu)先考慮字符串連接。
關(guān)系運(yùn)算符
關(guān)系運(yùn)算符 用于測試兩個值之間的關(guān)系,比如"相等"、"大于"等,根據(jù)關(guān)系是否存在(成立)而返回 true
或者是 false
。關(guān)系表達(dá)式總是返回一個布爾值,通常用在if、while以及for語句中用于控制程序的執(zhí)行流程。下面將依次介紹關(guān)系運(yùn)算符中的比較運(yùn)算符(<、<=、>、>=
) 和 (不)相(全)等運(yùn)算符。
比較運(yùn)算符 用來檢測兩個操作數(shù)的大小關(guān)系(數(shù)值大小或者字母表的順序)。需要注意JavaScript字符串是一個由16位整數(shù)值組成的序列,字符串的比較本質(zhì)上是對兩個字符串中的字符對應(yīng)的數(shù)值進(jìn)行比較,而且字符串比較是區(qū)分大小寫的,所有的大寫的ASCII字母都"小于"小寫的ASCII字母,點(diǎn)擊查看ASCII表。
/*比較運(yùn)算符的簡單使用:返回值均為布爾值*/
/*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
比較運(yùn)算符 的操作數(shù)可以是任意類型的,但只有 數(shù)字和字符串才能真正的執(zhí)行比較操作 ,其它的操作都將進(jìn)行類型轉(zhuǎn)換。在進(jìn)行類型轉(zhuǎn)換的時候,比較運(yùn)算符更偏愛數(shù)字所以會優(yōu)先把操作數(shù)都轉(zhuǎn)換為數(shù)字再比較,只有當(dāng)兩個操作數(shù)都是字符串的時候才會進(jìn)行字符串的比較( 字母表順序
)。
/*如果比較運(yùn)算符的兩個操作數(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é)下,如果比較運(yùn)算符的兩個操作數(shù)類型不同(不全是數(shù)字或者不全是字符串)的時候,會優(yōu)先把操作數(shù)轉(zhuǎn)換為數(shù)字。如果操作數(shù)中出現(xiàn)NaN(無論是類型轉(zhuǎn)換前還是轉(zhuǎn)換后),最終結(jié)果都將是NaN。
相等()和全等(=)運(yùn)算符 用于比較兩個值是否相等或全等,如果滿足則返回 true。其實相等()和全等(=)的核心區(qū)別在于相等僅比較值,而全等需要比較值和類型。
/*相等:僅僅比較值,如果類型不同那么會進(jìn)行類型轉(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
/*全等:也稱為嚴(yán)格相等,既比較值也比較類型,類型不同則直接返回false*/
console.log("1" === 1); //false 類型不同
console.log(true === 1); //false 類型不同
console.log(null === undefined); //false 類型不同
說明 需要注意區(qū)分"=="(相等)
、"==="(全等)
和"="(賦值)
,此外還有"!="
和"!=="
運(yùn)算符,它們的檢測規(guī)則剛好是 相等 和 全等 的求反。
邏輯運(yùn)算符
圖示已經(jīng)列出了JavaScript語言中的三種邏輯運(yùn)算符("邏輯非"
、"邏輯或"
和"邏輯與"
)以及它們的具體使用方式,在開發(fā)中邏輯運(yùn)算符常用在條件表達(dá)式中(如if語句的條件判斷),下面給出參考代碼。
/*01-邏輯非 該運(yùn)算符只有一個操作數(shù),作用是對操作數(shù)取反*/
console.log(!true); //false
console.log(!0); //true
console.log(!undefined); //true
/*02-邏輯或 該運(yùn)算符需要兩個操作數(shù)
* 運(yùn)算規(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-邏輯與 該運(yùn)算符需要兩個操作數(shù)
* 運(yùn)算規(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
其它常用運(yùn)算符
在最后,再簡單介紹JavaScript語言中的賦值運(yùn)算符
、自增自減運(yùn)算符
以及特殊的三元運(yùn)算符
。
賦值運(yùn)算符 JavaScript使用=
運(yùn)算符來給變量賦值,該運(yùn)算符希望它的左操作數(shù)是一個左值(一個變量或者是對象屬性),而它的右操作數(shù)可以是任意類型的任意值。需要注意的是,=
的優(yōu)先級很低,且它的結(jié)合性是從右至左(即如果一個表達(dá)式中出現(xiàn)了多個賦值運(yùn)算符,那么運(yù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
帶操作的賦值運(yùn)算符 主要有+=
、-=
、*=
、/=
以及%=
等,當(dāng)然還包括<<=
等位操作符和賦值操作符的組合(此文不涉及位操作符)。這里列出的這些運(yùn)算符它們其實是算術(shù)運(yùn)算符和賦值運(yùn)算符的組合,是一種常用的簡寫形式,下面給出示例代碼。
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--)
運(yùn)算符,它們的作用是在當(dāng)前值的基礎(chǔ)上+1或者是-1,而++i
和i++
對于i這個變量本身而言沒區(qū)別,它們的區(qū)別在于如果有涉及返回值的操作,那么++i
的更新會體現(xiàn)在返回值中(換句話說就是先對變量的+1,然后把結(jié)果返回),而i++
則不會(先把i返回,然后再執(zhí)行變量的+1操作),自減運(yùn)算符同理。
/*說明: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++);*/
條件運(yùn)算符( ? : ) 也被稱為三元運(yùn)算符,因為該運(yùn)算符需要三個操作數(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)先級備注 我們在編寫JavaScript表達(dá)式的時候,需要注意運(yùn)算符是有優(yōu)先級的,譬如var a = x + y * b;
這行代碼,因為 乘法運(yùn)算符比 加法運(yùn)算符的優(yōu)先級,其次是等號賦值運(yùn)算符,因此其執(zhí)行順序是先計算 y * b
,然后再 + x
的值,最終才把結(jié)果賦值給a。在開發(fā)中,我們可以通過圓括號來強(qiáng)行指定運(yùn)算順序。如果var a = (x + y) * b;
這樣寫代碼,那么就先加再乘最后才進(jìn)行賦值操作。
本文摘自 :https://www.cnblogs.com/