JavaScript運算符詳解
1、javascript具有下列種類的運(yun)(yun)算(suan)(suan)符(fu)(fu):算(suan)(suan)術(shu)運(yun)(yun)算(suan)(suan)符(fu)(fu);等同(tong)運(yun)(yun)算(suan)(suan)符(fu)(fu)與(yu)全同(tong)運(yun)(yun)算(suan)(suan)符(fu)(fu);比(bi)較運(yun)(yun)算(suan)(suan)符(fu)(fu);
2、目的分類:字(zi)符串運(yun)算(suan)符;邏輯(ji)運(yun)算(suan)符;逐位(wei)運(yun)算(suan)符;賦值運(yun)算(suan)符;
3、特(te)殊運(yun)算(suan)符(fu)(fu)(fu)(fu):條件運(yun)算(suan)符(fu)(fu)(fu)(fu);typeof運(yun)算(suan)符(fu)(fu)(fu)(fu);創建(jian)對象運(yun)算(suan)符(fu)(fu)(fu)(fu)new;delete運(yun)算(suan)符(fu)(fu)(fu)(fu);void運(yun)算(suan)符(fu)(fu)(fu)(fu)號(hao);逗號(hao)運(yun)算(suan)符(fu)(fu)(fu)(fu);
算術運算符(fu):+ 、 - 、* 、 / 、 % 、 -(一元取反) 、 ++ 、 --
等同(tong)運(yun)算符與全同(tong)運(yun)算符:== 、 ===、 !== 、 !===
比較運算(suan)符:< 、 > 、 <= 、 >=
字符串(chuan)運算符::< 、 > 、 <= 、 >= 、 = 、 +
邏輯(ji)運算符:&& 、 ||、 !、
賦(fu)值運算符:=、 +=、 *=、 -=、 /=
規則:
一、一定(ding)要注(zhu)意傳遞(di)給(gei)運算符的數據(ju)類(lei)型(xing)和返回的數據(ju)類(lei)型(xing)!不(bu)同的運算符都期望它(ta)的運算數表(biao)達式計算出的結果符合某(mou)種數據(ju)類(lei)型(xing)。
例如(ru):對(dui)字(zi)符(fu)串(chuan)是(shi)(shi)(shi)不能(neng)進(jin)行乘(cheng)法(fa)運算的(de)(de),"a" * "b" 是(shi)(shi)(shi)不合法(fa)的(de)(de),但是(shi)(shi)(shi),在可(ke)能(neng)的(de)(de)情況下,javascript會把表達式(shi)(shi)轉換(huan)成(cheng)正(zheng)確(que)的(de)(de)類型,因此,表達式(shi)(shi) "3" * "5" 是(shi)(shi)(shi)合法(fa)的(de)(de),javascript將字(zi)符(fu)串(chuan)轉換(huan)成(cheng)數字(zi)執行運算,結果返回的(de)(de)是(shi)(shi)(shi)數字(zi)15,而不是(shi)(shi)(shi)字(zi)符(fu)串(chuan)"15"。
二、+ 根據運(yun)算數的不同,具有不同的表現:
字符(fu)串 + 字符(fu)串 = 字符(fu)串(被連接(jie));"a" + "b" = "ab" "5" + "6" = "11"
字(zi)(zi)(zi)符串 + 數字(zi)(zi)(zi) = (字(zi)(zi)(zi)符串轉換(huan)成數字(zi)(zi)(zi))字(zi)(zi)(zi)符串(被連接);"a" + 5 = "a5" 5被轉換(huan)成字(zi)(zi)(zi)符串 "1" + 0 = "10"
數字(zi) + 數字(zi) = 數字(zi)(相加)5 + 5 = 10。
三、注(zhu)意運算(suan)符的結合(he)性,有些(xie)運算(suan)符從左到右的結合(he)性;有些(xie)從右到左結合(he)性。
例如(ru):w = a + b + c 等(deng)同于 w = (a + b) + c;
w = ---b 等同于 w = - ( - ( -b ) ); w = a = b = c 等同于 w= ( a = ( b = c ))
一元(yuan)運算(suan)符、賦值運算(suan)符、三(san)元(yuan)運算(suan)符的(de)結合性是從(cong)右(you)到左的(de);
四(si)、算術(shu)運算符規則:
“+”:可以進行“加法”與“連(lian)接(jie)”運算;如果2個運算符中(zhong)的一個是(shi)字(zi)符串(chuan),javascript就將(jiang)另一個轉換成字(zi)符串(chuan),然(ran)后將(jiang)2個運算數連(lian)接(jie)起來。
“+”:如果(guo)一個(ge)運算(suan)(suan)數(shu)是(shi)對象,javascript就會將(jiang)對象轉換成數(shu)字做加法運算(suan)(suan)或(huo)者字符串做連(lian)接運算(suan)(suan);
“-”“*”“/” 如果2個運算數(shu)中的一(yi)個是(shi)是(shi)非數(shu)字,則將(jiang)它轉化成(cheng)數(shu)字執行數(shu)學運算。
“/” 在javascript中(zhong),由(you)于所(suo)有的數(shu)都是浮(fu)點數(shu),除(chu)法(fa)的結(jie)果都是浮(fu)點數(shu),5 / 2 = 2.5 ;除(chu)數(shu)為0的結(jie)果為正負無(wu)窮;0/0為NaN;
“%”模(mo)運(yun)(yun)算(suan)符:計算(suan)第(di)一個(ge)運(yun)(yun)算(suan)數(shu)對第(di)二個(ge)運(yun)(yun)算(suan)數(shu)的(de)模(mo),就是第(di)一個(ge)運(yun)(yun)算(suan)數(shu)被第(di)二個(ge)運(yun)(yun)算(suan)數(shu)除(chu)時,返回(hui)余數(shu)。如果運(yun)(yun)算(suan)數(shu)是非數(shu)字的(de),則轉(zhuan)換成數(shu)字。
“-”一元取反:將運(yun)算數取反,如果運(yun)算數不是(shi)數字(zi),則轉化成數字(zi)。
“++”“--”增量(liang)運(yun)算(suan)符/減量(liang)運(yun)算(suan)符號:運(yun)算(suan)數(shu)必須是一(yi)個(ge)變量(liang)、樹組(zu)的一(yi)個(ge)元素(su)或對象的一(yi)個(ge)屬性。如果(guo)運(yun)算(suan)數(shu)不是數(shu)字,則轉換成(cheng)數(shu)字。
注意:如果“++”位于運算(suan)(suan)數(shu)之前,先(xian)對(dui)運算(suan)(suan)數(shu)進(jin)行增(zeng)量,然后(hou)計算(suan)(suan)運算(suan)(suan)數(shu)增(zeng)長后(hou)的值(zhi)。
如果“--”位(wei)于運算(suan)(suan)數(shu)(shu)(shu)之(zhi)后(hou),先計算(suan)(suan)運算(suan)(suan)數(shu)(shu)(shu)未增長之(zhi)前的值,然后(hou)對(dui)運算(suan)(suan)數(shu)(shu)(shu)增量(liang)。
例如(ru):i = 1; //賦值給(gei)i值1
j = ++i; //先(xian)將i增(zeng)量為(wei)2,然后將2賦(fu)值(zhi)(zhi)給j,i的值(zhi)(zhi)是2,j的值(zhi)(zhi)也是2。
i = 1; //賦值給i值1
j = i++; //先(xian)將i賦值給j,然后對將i值增(zeng)量到(dao)2,i的值是(shi)2,j的值是(shi)1。
減(jian)量運算(suan)符“--”與“++”相同。
五(wu)、等同(tong)運算(suan)符與(yu)全同(tong)運算(suan)符:
(一)“==”“!==”等(deng)同(tong)運算符與非(fei)等(deng)同(tong)運算符:
比較2個運算數,返回(hui)一(yi)個不布(bu)爾值(zhi)。
比較數值(zhi)、字(zi)符串、布爾值(zhi)使用的(de)都(dou)是量值(zhi)。當(dang)且僅當(dang)兩個變量存放的(de)值(zhi)相(xiang)等的(de)時候,他們才相(xiang)等。
比較對象(xiang)、數組(zu)、函數的(de)(de)時候,使用(yong)的(de)(de)是(shi)引用(yong),只有2個變量引用(yong)的(de)(de)是(shi)同(tong)一(yi)個對象(xiang)時,他們才是(shi)相(xiang)等的(de)(de)
。兩(liang)個不同(tong)的數組是完(wan)(wan)全不同(tong)的,即使他們具有完(wan)(wan)全相同(tong)的元素。對于存(cun)放對象(xiang)、數組、函數的引(yin)用(yong)的變量來
說,只有當他們引(yin)用的(de)是同一(yi)個對象、數組(zu)、函數的(de)時候,他們才相等。
注意!應遵循的原則:
當兩個(ge)運算數的(de)(de)類型不同時:將他們轉(zhuan)換(huan)成相同的(de)(de)類型,
1)一個數字與一個字符串,字符串轉(zhuan)換成數字之后,進行比較。
2)true轉換(huan)為1、false轉換(huan)為0,進行比較。
3)一個(ge)(ge)對象(xiang)、數組(zu)(zu)、函(han)數 與(yu) 一個(ge)(ge)數字(zi)或字(zi)符串,對象(xiang)、數組(zu)(zu)、函(han)數轉換為原(yuan)始類(lei)型(xing)的值,然后進行比較(jiao)。(先使用valueOf,如果不行就使用toString)
4)其他類型(xing)的(de)組合不(bu)星等(deng)。
想兩個運算數類型相同,或轉換成相同類型后(hou):
1)2個(ge)字符串(chuan):同(tong)一位置上的字符相(xiang)等(deng),2個(ge)字符串(chuan)就相(xiang)同(tong)。
2)2個數字(zi):2個數字(zi)相同(tong)(tong),就相同(tong)(tong)。如果一(yi)個是NaN,或兩個都(dou)是NaN,則不相同(tong)(tong)。
3)2個都(dou)是true,或者2個都(dou)是false,則想同。
4)2個引用的(de)(de)是(shi)同一個對(dui)象、函(han)數(shu)、數(shu)組(zu),則(ze)他們相(xiang)等,如(ru)果(guo)引用的(de)(de)不是(shi)同一個對(dui)象、函(han)數(shu)、數(shu)組(zu),則(ze)不相(xiang)同,即使這2個對(dui)象、函(han)數(shu)、數(shu)組(zu)可以轉換成完全(quan)相(xiang)等的(de)(de)原始值(zhi)。
5)2個null,或者2個都是未定義(yi)的,那么他們相等。
“!=”非(fei)等同運(yun)算(suan)符(fu):與(yu)等同運(yun)算(suan)符(fu)檢(jian)測(ce)的結果相反。
(二)“===”“!===”全同運(yun)算(suan)符與非全同運(yun)算(suan)符號:
全同運(yun)(yun)算(suan)符遵循等(deng)同運(yun)(yun)算(suan)符的比較(jiao)(jiao)規則(ze),但是(shi)它不對運(yun)(yun)算(suan)數進行(xing)類(lei)(lei)型轉(zhuan)換,當兩個運(yun)(yun)算(suan)數的類(lei)(lei)型不同時,返回false;只(zhi)有當兩個運(yun)(yun)算(suan)數的類(lei)(lei)型相同的時候,才(cai)遵循等(deng)同運(yun)(yun)算(suan)符的比較(jiao)(jiao)規則(ze)進行(xing)比較(jiao)(jiao)。
“!==”非全同(tong)運(yun)算符與(yu)全同(tong)運(yun)算符比較的結(jie)果相反。如果兩(liang)個(ge)運(yun)算數的類型(xing)或(huo)者值不同(tong)的時(shi)候,返回true。
六、比較運算符:
這些比(bi)較(jiao)運(yun)算符用于比(bi)較(jiao)不同類型的值,結(jie)果返回(hui)一個(ge)布爾(er)值。
“<”“>”“<=”“>=”
注意規則:比較的運(yun)算數(shu)可以是(shi)任意類型的,但是(shi)只能在數(shu)字和(he)(he)運(yun)算數(shu)上執行。不是(shi)數(shu)字和(he)(he)字符串的運(yun)算數(shu)將被轉換成(cheng)數(shu)字或字符串。
1)如果兩個運算數都(dou)是(shi)數字(zi),或(huo)者都(dou)可以轉換成數字(zi),則按(an)照(zhao)數字(zi)的大小進行比較;
2)如果兩個運算數都(dou)是字(zi)符串,或(huo)者都(dou)可以轉換成字(zi)符串,則將按照字(zi)母順序進行比(bi)較;
3)如果字(zi)符串遇(yu)到數字(zi),則將字(zi)符串轉換成數字(zi)進行比(bi)較。
4)如(ru)果運算(suan)數既不能(neng)轉(zhuan)換(huan)成數字,也(ye)不能(neng)轉(zhuan)換(huan)成字符串(chuan),則返回(hui)結果false。
七、字符串運算符:
并沒有專用的字符(fu)串(chuan)(chuan)運算(suan)符(fu),只是有些運算(suan)符(fu)在遇到(dao)字符(fu)串(chuan)(chuan)運算(suan)數的時候,表現(xian)不同。
(一)“+”連接2個字(zi)符串;
1)當2個運算數都是字符串的時候,連(lian)接(jie)起來;
2)當其中有一個是數(shu)字的時候,將數(shu)字轉換成字符串,連接起來;
(二)“>”這樣的(de)比(bi)較(jiao)(jiao)運(yun)算符通過(guo)比(bi)較(jiao)(jiao)確認兩個字(zi)符串的(de)順序,比(bi)較(jiao)(jiao)采用字(zi)符的(de)順序,較(jiao)(jiao)小(xiao)的(de)位(wei)于(yu)教(jiao)大的(de)前面,大寫字(zi)母位(wei)于(yu)小(xiao)寫字(zi)母之前。
(三)“+”的(de)作(zuo)用(yong)方法(fa)取決于計算順序,
如:s = 1 + 2 +"var" 則:返回(hui)結果3var; 因為先計算1+2,然后將結果3轉換成字符串與"var"連接;
如:s = "var" + 1 + 2 則(ze):返回結果(guo)var12; 因為(wei)先計算var與1的(de)連接(jie),在將(jiang)結果(guo)var1與轉換成字(zi)符(fu)串的(de)2連接(jie)起來。
八、邏(luo)輯運(yun)算符:
用于(yu)執(zhi)行(xing)布爾運算(suan)(suan)(suan),常(chang)常(chang)和比較(jiao)(jiao)運算(suan)(suan)(suan)符一起使用,來表示復雜(za)的(de)比較(jiao)(jiao)運算(suan)(suan)(suan)。
“&&” 邏(luo)輯(ji)與運(yun)算(suan)、“||”邏(luo)輯(ji)或(huo)運(yun)算(suan)符(fu)、“!”邏(luo)輯(ji)非運(yun)算(suan)符(fu)
(一)“&&”當(dang)兩個(ge)運算數都是布爾(er)值(zhi)的時(shi)候,邏輯與對他們進行and操作,即:當(dang)且(qie)僅(jin)當(dang)兩個(ge)布爾(er)值(zhi)都是true的時(shi)候,返回結果true,否(fou)則返回false。
注意:實際表現
“&&”將檢測第一個表(biao)達式(shi)(shi)運(yun)算數布(bu)爾值,如(ru)果(guo)第一個運(yun)算數表(biao)達式(shi)(shi)返回false,則返回左(zuo)邊第一個運(yun)算數表(biao)達式(shi)(shi)的(de)值:false;否則將繼續檢測第二個即右邊的(de)運(yun)算數表(biao)達式(shi)(shi),然后(hou)返回第二個運(yun)算數表(biao)達式(shi)(shi)的(de)值;
例如:if (a = b) stop(); 與 (a = b) && stop(); 等價
不(bu)贊成使用(yong)這(zhe)個方法,因(yin)為運算符右邊的(de)代碼不(bu)能保證(zheng)會被(bei)執行,
例(li)如:if ((a < b) && (b++ <10) ) stop();如果運(yun)算符(fu)右邊的(de)(de)增(zeng)量必須的(de)(de)話,卻有可能由(you)于前面(mian)的(de)(de)返(fan)回值而(er)不被(bei)執行,一(yi)般反對在&&的(de)(de)右邊使用具有其他作用的(de)(de)表達式(賦值、函數(shu)調用、增(zeng)減量);
將“&&”看作是一個布爾(er)代數的運算符,會(hui)更(geng)簡單與安(an)全(quan)。
(二)“||”當兩個(ge)運算數都是布(bu)爾(er)值(zhi)的(de)時候,邏輯或對他們進行or操作,即:當兩個(ge)布(bu)爾(er)值(zhi)有一個(ge)是true的(de)時候,返回結果true,否(fou)則返回false。
注意:實際(ji)表現
“||”將(jiang)檢測(ce)第(di)一個(ge)(ge)(ge)表(biao)達(da)式(shi)運算(suan)數布爾值,如(ru)果第(di)一個(ge)(ge)(ge)運算(suan)數表(biao)達(da)式(shi)返(fan)回true,則返(fan)回左邊第(di)一個(ge)(ge)(ge)運算(suan)數表(biao)達(da)式(shi)的值:true;否則將(jiang)繼續檢測(ce)第(di)二個(ge)(ge)(ge)即右邊的運算(suan)數表(biao)達(da)式(shi),然后返(fan)回第(di)二個(ge)(ge)(ge)運算(suan)數表(biao)達(da)式(shi)的值;
同(tong)樣不(bu)(bu)贊成使(shi)用這個方法,因(yin)為運算(suan)符右邊的代碼不(bu)(bu)能保證(zheng)會被執行,
一般反對在||的(de)右邊使用具有其他作用的(de)表達(da)式(賦值、函數(shu)調用、增(zeng)減量(liang));
將“||”看作是一個布(bu)爾(er)代(dai)數(shu)的運算(suan)符,會更簡單(dan)與安全。
(三)“!”邏(luo)輯非(fei)是一個一元運(yun)算符,放在運(yun)算數(shu)之(zhi)前,它(ta)的目的是對運(yun)算數(shu)取反。
九、賦值(zhi)運算符:
(一(yi))“=”是(shi)賦值運算符(fu);他(ta)總是(shi)期望左邊的(de)運算數是(shi)一(yi)個(ge)(ge)變量(liang)、數組(zu)的(de)一(yi)個(ge)(ge)元素(su)或(huo)對象的(de)一(yi)個(ge)(ge)屬性;
期望右邊(bian)是一個任意(yi)類(lei)型(xing)的(de)任意(yi)的(de)值;
從(cong)右到左(zuo)的結合性,如果一個表達(da)式(shi)中(zhong)有多個賦值運算符,則(ze)從(cong)最右邊開始計(ji)算。
注意:每一(yi)個賦值表達式(shi)都有一(yi)個值,就是運(yun)算符右邊的值;
(二(er))可以使用帶操(cao)作(zuo)的賦值運算
“+=” 左邊的(de)值(zhi)加上右邊的(de)值(zhi)后,賦值(zhi)于(yu)左邊的(de)值(zhi)。“-=”“/=”“*=”方法一樣;
十、其他(ta)運(yun)算符:
“?:”條(tiao)件(jian)運(yun)(yun)算(suan)(suan)符(fu)是唯一的一個三元運(yun)(yun)算(suan)(suan)符(fu);
一(yi)個(ge)表(biao)(biao)(biao)達(da)式的布爾結果?表(biao)(biao)(biao)達(da)式1(任意類(lei)(lei)型的任意值):表(biao)(biao)(biao)達(da)式2(任意類(lei)(lei)型的任意值);
根據第一個(ge)運(yun)(yun)算數的(de)布爾值(zhi)(zhi)結果(guo),如(ru)果(guo)為true,則執行第二個(ge)運(yun)(yun)算數表達式,返回第二個(ge)運(yun)(yun)算數表達式的(de)值(zhi)(zhi);如(ru)果(guo)第一個(ge)運(yun)(yun)算數的(de)布爾值(zhi)(zhi)結果(guo)是(shi)false,則執行第三個(ge)運(yun)(yun)算數表達式,返回第三個(ge)運(yun)(yun)算數表達式的(de)值(zhi)(zhi)。
