詳解JavaScript的表達(dá)式與運(yùn)算符
JavaScript腳本語言描述了一組用于操作數(shù)據(jù)值的運(yùn)算符,包括一元運(yùn)算符,布爾運(yùn)算符,算術(shù)運(yùn)算符,關(guān)系運(yùn)算符,三元運(yùn)算符,位運(yùn)算符和賦值運(yùn)算符。
表達(dá)式是JavaScript語言的一個(gè)“短語”,包含變量名(或字面量)和運(yùn)算符。最簡單的表達(dá)式時(shí)字面量或變量名。當(dāng)然也有合并簡單的表達(dá)式來創(chuàng)建復(fù)雜的表達(dá)式。
一、一元運(yùn)算符
(1)遞增++和遞減--
var box1=100;
++box1;//相當(dāng)于box=box+1
document.write("box1="+box1+"<br/>");//輸出box1=101
var box2=100;
--box2;//相當(dāng)于box=box2-1
document.write("box2="+box2);//輸出box2=99
前置和后置的區(qū)別
var box=100;
var age=++box;//box先累加1為101,再賦值給age為101
var height=box++;//box先賦值給height為101,box再累加為102
document.write("age="+age+"<br/>");//輸出age=101
document.write("height="+height+"<br/>");//輸出height=101
document.write("box="+box);//輸出box=102,原因是box經(jīng)過了兩次累加,所以是102
在沒有賦值操作,前置和后置是一樣的。但在賦值操作時(shí),如果遞增或遞減運(yùn)算符前置,那么前置的運(yùn)算符會(huì)先累加或累減再賦值,如果是后置運(yùn)算符則先賦值再累加或累減。
(2)加和減運(yùn)算符
用于取正或取負(fù)運(yùn)算,也有把數(shù)字字符串轉(zhuǎn)換為數(shù)值形式的功能。
var box = "20"; document.write(typeof box+"<br/>"); //輸出string var age=-box; document.write(age+"<br/>");//輸出-20 document.write(typeof age); //輸出number
二、算術(shù)運(yùn)算符
JavaScript語言中規(guī)定了五種算術(shù)運(yùn)算符,即+,-,*,/和%(取余)。如果在算術(shù)運(yùn)算符的值不是數(shù)值,那么它會(huì)先使用Number()轉(zhuǎn)型函數(shù)將其轉(zhuǎn)換為數(shù)值(隱式轉(zhuǎn)換)。
var box=100+"100";
document.write("box="+box+"<br/>");//輸出100100
document.write(typeof box);//輸出string
這是為什么呢?JavaScript語言中的做算術(shù)運(yùn)算時(shí),只要其中一個(gè)是字符串,那么結(jié)果就會(huì)轉(zhuǎn)換為字符串。相當(dāng)于字符串連接符,不能再算作是加法算術(shù)運(yùn)算符。
var box="100"-10;
document.write("box="+box+"<br/>");//輸出90
var age=5/4;
document.write("age="+age+"<br/>");//輸出1.25
var height=("你的年齡是:"+(10+10));//括號(hào)強(qiáng)制優(yōu)先級(jí)
document.write(height);//輸出你的年齡是:20
取余
var box=10%3;
document.write("box="+box);//輸出1
三、關(guān)系運(yùn)算符
用于進(jìn)行比較的運(yùn)算符稱作為關(guān)系運(yùn)算符:<(小于),>(大于),<=(小于等于),>=(大于等于),==(相對(duì)),!=(不等),===(恒等或全等),!==(不全等或不恒等)。關(guān)系運(yùn)算符大多數(shù)返回的是一個(gè)布爾值。
和其他運(yùn)算符一樣,當(dāng)關(guān)系運(yùn)算符操作非數(shù)值時(shí)要遵循以下規(guī)則:
1兩個(gè)操作符都是數(shù)值,則數(shù)值比較
2兩個(gè)操作數(shù)都是字符串,則比較兩個(gè)字符串對(duì)應(yīng)的字符編碼值
3兩個(gè)操作數(shù)有一個(gè)是數(shù)值,則將另一個(gè)轉(zhuǎn)換為數(shù)值,在進(jìn)行數(shù)值比較
4兩個(gè)操作數(shù)有一個(gè)是對(duì)象,則先調(diào)用value()方法或toString()方法,再用結(jié)果比較。
var box1=3>2; document.write(box1+"<br/>");//輸出true var box2="3">22; document.write(box2+"<br/>");//輸出false var box3="3">"22"; document.write(box3+"<br/>");//輸出true var box4="a">"B";//a為97,B為66 document.write(box4+"<br/>");//輸出true var box5= "Blue"<"alpha";//Blue的第一個(gè)字母是B,alpha的第一個(gè)字母是a,a為97,B為66 document.write(box5) //輸出true
在相等和不等的比較上,如果操作數(shù)是非數(shù)值,則遵循以下規(guī)則:
1一個(gè)操作數(shù)是布爾值,則比較之前將其轉(zhuǎn)換為數(shù)值,false轉(zhuǎn)成0,true轉(zhuǎn)成1。
2一個(gè)操作數(shù)是字符串,則比較之前將其轉(zhuǎn)成為數(shù)值再比較。
3一個(gè)操作數(shù)是對(duì)象,則先調(diào)用value()方法或toString()方法再比較。
4不需要任何轉(zhuǎn)換的情況下,null和undefined是相等的
5一個(gè)操作數(shù)是NaN,則==返回false,!=返回true,并且NaN和自身不等
6兩個(gè)操作數(shù)都是對(duì)象,則比較它們是否是同一個(gè)對(duì)象,如果都指向同一個(gè)對(duì)象,則返回true,否則返回false
7在全等和全不等的判斷上,比如值和類型都相等,才返回true,否則返回fasle。
var box1='2'==2;
document.write(box1+"<br/>");//輸出true,比較的只是數(shù)值
var box2={}=={};
document.write(box2+"<br/>");//輸出false,因?yàn)楸容^的是它們的地址,每個(gè)新創(chuàng)建對(duì)象的引用地址都不同。
var box3=null==undefined;
document.write(box3+"<br/>");//輸出true,因?yàn)榫鶠榭諗?shù)值
var box4='2'===2;
document.write(box4+"<br/>");//輸出false,兩個(gè)操作數(shù)的數(shù)據(jù)類型不相等
var box5=null===undefined;
document.write(box5);//輸出false,兩個(gè)操作數(shù)的數(shù)據(jù)類型不相等
四邏輯運(yùn)算符
JavaScript語言中的邏輯運(yùn)算符通常作用于布爾值的操作,一般和關(guān)系運(yùn)算符配合使用,有三個(gè)邏輯運(yùn)算符:&&(邏輯與),||(邏輯或)和!(邏輯非)。
(1)&&表示兩邊都必須是true,才返回true。
如果兩邊的操作數(shù)有一個(gè)操作數(shù)不是布爾值的情況下,與運(yùn)算就不一定返回布爾值,此時(shí)遵循下面的規(guī)則:
1第一個(gè)操作數(shù)是對(duì)象,則返回第二個(gè)操作數(shù)
2第二操作數(shù)是對(duì)象,則第一個(gè)操作數(shù)返回true,才返回第二個(gè)操作數(shù),否則返回false
3一個(gè)操作數(shù)是null,則返回null
4一個(gè)操作數(shù)是undefined,則返回undefined
5如果一個(gè)運(yùn)算數(shù)是對(duì)象,另一個(gè)是 Boolean 值,返回該對(duì)象
邏輯與運(yùn)算符屬于短路操作,如果有第一個(gè)操作數(shù)返回的是false,第二個(gè)不管是true還是false都返回false。
var box1={}&&(5>4);
document.write(box1+"<br/>");//輸出true
var box2=(5>4)&&{};
document.write(box2+"<br/>");//輸出[object Object]
var box3=(3>4)&&{};
document.write(box3);//輸出false
(2)||表示兩邊有一個(gè)是true,就返回true。
如果兩邊的操作數(shù)有一個(gè)操作數(shù)不是布爾值的情況下,與運(yùn)算就不一定返回布爾值,此時(shí)遵循下面的規(guī)則:
1第一個(gè)操作數(shù)是對(duì)象,則返回第一個(gè)個(gè)操作數(shù)
2第一個(gè)操作數(shù)的求值結(jié)果為fasle,則返回第二個(gè)操作數(shù)
3兩個(gè)操作數(shù)都是對(duì)象,則返回第一個(gè)操作數(shù)
4兩個(gè)操作數(shù)都是null,則返回null
5兩個(gè)操作數(shù)都是undefined,則返回undefined
6兩個(gè)操作數(shù)都是NaN,則返回NaN
邏輯或運(yùn)算符也屬于短路操作,如果有第一個(gè)操作數(shù)返回的是true,第二個(gè)不管是true還是false都返回true。
var box1={}||(5>4);
document.write(box1+"<br/>");//輸出[object Object]
var box2=(5>4)||{};
document.write(box2+"<br/>");//輸出true
var box3=(3>4)||{};
document.write(box3);//輸出[object Object]
(3)!邏輯非運(yùn)算符可以作用與任何值,無論這個(gè)值是什么數(shù)據(jù)類型,這個(gè)運(yùn)算符都會(huì)返回一個(gè)布爾值,它的流程是:先將這個(gè)值轉(zhuǎn)換成布爾值,然后取反,規(guī)則如下:
1操作數(shù)是一個(gè)對(duì)象,返回false
2操作數(shù)是一個(gè)空字符串,返回true
3操作數(shù)是一個(gè)非空字符串,返回false
4操作數(shù)是數(shù)值0,返回true
5操作數(shù)是任意非0數(shù)值,返回false
6操作數(shù)是null,返回true
7操作數(shù)是NaN,返回true
8操作數(shù)是undefined,返回true
var box=!{};
document.write(box);//輸出false
五、位運(yùn)算符
JavaScript語言中包括了七種位運(yùn)算符:~(位非),&(位與),|(位或),^(位異或),<<(左移),>>(有符右移號(hào)),>>>(無符號(hào)右移)
(1)位非(~)運(yùn)算把運(yùn)算數(shù)轉(zhuǎn)換成32位數(shù)字,然后把二進(jìn)制數(shù)轉(zhuǎn)換成它的二進(jìn)制反碼,最后把二進(jìn)制數(shù)轉(zhuǎn)換成浮點(diǎn)數(shù)。實(shí)質(zhì)上是對(duì)數(shù)字求負(fù),然后減去1即為所得值。
var box=~25; document.write(box);//輸出-26
(2)位與(&)運(yùn)算直接對(duì)數(shù)字的二進(jìn)制形式進(jìn)行運(yùn)算,然后對(duì)上下同一位置的兩個(gè)數(shù)位進(jìn)行與運(yùn)算,只有兩個(gè)數(shù)位都為1時(shí)才得出1,其余的均為0.
var box=25&3; document.write(box);//輸出1
(3)位或(|)運(yùn)算也是直接對(duì)數(shù)字的二進(jìn)制形式進(jìn)行計(jì)算,然后對(duì)上下同一位置的兩個(gè)數(shù)位進(jìn)行或運(yùn)算,只右兩個(gè)數(shù)位都為0時(shí)才得出0,其余的均為1.
var box=25|3; document.write(box);//輸出27
(4)位異或(^)也是直接對(duì)二進(jìn)制形式進(jìn)行運(yùn)算。當(dāng)只有一個(gè)數(shù)位存放的是1時(shí),它才返回1。其余的返回0。也就是兩個(gè)數(shù)位相同時(shí)返回0,不同時(shí)返回1.
var box=25^3; document.write(box);//輸出26
(5)左移運(yùn)算也是對(duì)二進(jìn)制數(shù)進(jìn)行操作,相等于第一個(gè)操作數(shù)乘以(2的左移位數(shù)次冪)的積。
var box=25<<3; document.write(box);//25左移3位相當(dāng)于25乘以(2的3次冪),因此輸出200
(6)有符號(hào)右移運(yùn)算也是對(duì)二進(jìn)制數(shù)進(jìn)行操作,相等于第一個(gè)操作數(shù)除以(2的右移位數(shù)次冪)的商。
var box=24>>2; document.write(box);//輸出6
(7)無符號(hào)右移運(yùn)算也是對(duì)二進(jìn)制數(shù)進(jìn)行操作,對(duì)于正數(shù),與有符號(hào)右移是相同的結(jié)果,但是對(duì)于負(fù)數(shù),就會(huì)所不同。
六、賦值運(yùn)算符
賦值運(yùn)算符包括:=(),+=(),-=(),*=(),/=(),%=(),<<=(),>>=(),>>>=()。
var box=100;
box+=100;//相當(dāng)于box=box+100
document.write("box="+box);//輸出box=200
七、其他運(yùn)算符
1)、字符串運(yùn)算符:“+”,它的作用是將兩個(gè)字符串想加。規(guī)則:只要有一個(gè)字符串即可。
var box=100+"10"';
document.write("box="+box);//輸出100100
2)、逗號(hào)運(yùn)算符,可以在一條語句中執(zhí)行多個(gè)操作
var box=100,age=200,height=300;
document.write("box="+box);//輸出box=100
3)、三元操作符:
var box=(3>4)?"對(duì)":"錯(cuò)"; document.write(box);//輸出錯(cuò)
如果想更詳細(xì)的了解ECMAScript運(yùn)算符的知識(shí),可以訪問JavaScript高級(jí)教程中的ECMASscript一元運(yùn)算符這個(gè)系列中有詳細(xì)的運(yùn)算符教程。對(duì)于JS的運(yùn)算符來說,我們可以對(duì)比著C++,C#和Java來學(xué),這個(gè)還是相當(dāng)?shù)娜菀椎摹?/p>
以上就是關(guān)于JavaScript的表達(dá)式與運(yùn)算符的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
通過實(shí)踐編寫優(yōu)雅的JavaScript代碼
這篇文章主要介紹了如何通過實(shí)踐編寫優(yōu)雅的JavaScript代碼。文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來學(xué)習(xí)一下吧2019-05-05
H5實(shí)現(xiàn)手機(jī)拍照和選擇上傳功能
這篇文章主要為大家詳細(xì)介紹了H5實(shí)現(xiàn)手機(jī)拍照和選擇上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
moment.js 計(jì)算當(dāng)前一周、一月對(duì)應(yīng)日期的實(shí)例
這篇文章主要介紹了moment.js 計(jì)算當(dāng)前一周、一月對(duì)應(yīng)日期的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
代碼觸發(fā)js事件(click、change)示例應(yīng)用
Chrome , Firfox 不支持fireEvent的方法可以使用dispatchEvent的方法替代,直接給一個(gè)兼容的Code,下面有個(gè)不錯(cuò)的示例,喜歡的朋友可以收藏下2013-12-12
令按鈕懸浮在(手機(jī))頁面底部的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄畎粹o懸浮在(手機(jī))頁面底部的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
通過js簡單實(shí)現(xiàn)將一個(gè)文本內(nèi)容轉(zhuǎn)譯成加密文本
將文本內(nèi)容轉(zhuǎn)譯成加密文本,在某些情況下還是比較實(shí)用的,下面通過js簡單實(shí)現(xiàn)下,感興趣的朋友不要錯(cuò)過2013-10-10

