運(yùn)算符

一些運(yùn)算符可以作用于任何數(shù)據(jù)類型(typeof)空骚,但大部分操作符希望操作數(shù)是特定的類型携悯,而且大部分操作符會計(jì)算出(我們也常說返回)一個(gè)特定類型的值(typeof返回的全是string)进胯。在JavaScript中,運(yùn)算符通常會根據(jù)需要對操作數(shù)進(jìn)行類型轉(zhuǎn)換.

有些操作符對不同的數(shù)據(jù)類型有不同的含義,比如 +操作符

console.log(2+4);//6  兩個(gè)操作數(shù)都是數(shù)字,做加法運(yùn)算
console.log("2"+"4");//"24"  兩個(gè)參數(shù)都是字符串,做字符串拼接
console.log(2+"4");//"24"  有一個(gè)參數(shù)是字符串時(shí)振诬,把另外一個(gè)參數(shù)轉(zhuǎn)換為字符串做字符串拼接
console.log(2+new Date());//"2Mon Jan 20 2014 17:15:01 GMT+0800 (China Standard Time)"   在參數(shù)有對象的情況下會調(diào)用其valueOf或toString
console.log(+"4");//4  只有一個(gè)數(shù)字參數(shù)時(shí),返回其正數(shù)值

遠(yuǎn)算符類型

算數(shù)運(yùn)算符衍菱、賦值運(yùn)算符赶么、比較運(yùn)算符、布爾運(yùn)算符脊串、位運(yùn)算符禽绪,其它運(yùn)算符
位運(yùn)算符
否運(yùn)算(not):符號為~,表示將一個(gè)二進(jìn)制位變成相反值洪规。
對于十進(jìn)制,~X得到結(jié)果是取X的負(fù)值再減1
算數(shù)運(yùn)算符中循捺,
除法運(yùn)算符(Division):x / y 結(jié)果是浮點(diǎn)數(shù)

布爾運(yùn)算符中斩例,使用布爾運(yùn)算符,會先將運(yùn)算符兩邊的值轉(zhuǎn)化為布爾值从橘,然后進(jìn)行運(yùn)算念赶。

! 取反運(yùn)算符 /*表示轉(zhuǎn)換為布爾類型之后取反,由此可得!!表示強(qiáng)制轉(zhuǎn)化成布爾類型*/
&& 且運(yùn)算符
|| 或運(yùn)算符
condition? true case : false case 三元條件運(yùn)算符

小括號
圓括號不是運(yùn)算符恰力,而是一種語法結(jié)構(gòu)叉谜。它有兩種用法:如果把表達(dá)式放在圓括號之中,作用是求值踩萎,將返回表達(dá)式的值停局;如果跟在函數(shù)的后面,作用是調(diào)用函數(shù)香府。

void
void運(yùn)算符的作用是執(zhí)行一個(gè)表達(dá)式董栽,然后返回undefined。

void 0 和 undefined在使用場景上有什么區(qū)別
void 后面無論跟什么表達(dá)式企孩,都會返回 undefined锭碳。
某些情境下undefined是可以被賦值的,比如在函數(shù)中var undefined = 3;這樣的話就不能用undefined來進(jìn)行判斷了勿璃。所以用void 0返回undefined來進(jìn)行判斷擒抛。既減少了在原形鏈上查找 window.undefined 的時(shí)間推汽,也避免了誤用被修改過的 undefined。

逗號運(yùn)算符
逗號運(yùn)算符用于對兩個(gè)表達(dá)式求值歧沪,并返回后一個(gè)表達(dá)式的值歹撒。

a = (3,4)  //a=4
a = 3,4 //a=3,因?yàn)?的優(yōu)先級高于,

重要:運(yùn)算符優(yōu)先級與結(jié)合性

有的運(yùn)算符是左結(jié)合的槽畔,即運(yùn)算從左到右執(zhí)行栈妆,下面兩個(gè)運(yùn)算是一樣的

w = x + y + z;
w = (x + y) + z;

有的運(yùn)算符是右結(jié)合的,即運(yùn)算從右到左執(zhí)行

w = x = y = z;
w = (x = (y = z));
w = a: b: c ? d : e? f : g;
w = a? b : (c? d: (e? f : g));

下表中R/L代表結(jié)合性是右結(jié)合還是左結(jié)合厢钧,
num->num表示操作符期望的數(shù)據(jù)類型計(jì)算結(jié)果類型鳞尔,lval指左值
運(yùn)算符優(yōu)先級表
以及MDN 參考

有幾個(gè)我們需要注意的地方
1.typeof的優(yōu)先級相當(dāng)?shù)母撸燃訙p乘除神馬的都高早直,所以雖然是操作符寥假,在在復(fù)雜表達(dá)式的時(shí)候我們還是習(xí)慣加括號,看個(gè)例子

 typeof 2*3;//NaN  因?yàn)闀扔?jì)算typeof 2 霞扬,結(jié)果是"number"糕韧,即string類型,與3相乘得NaN
 typeof (2*3);//"number" 
 typeof 2+3;// "number3"   "number"+3 得"number3"

2.++喻圃、--是右結(jié)合的操作符(優(yōu)先級最高的幾個(gè)都是右結(jié)合)萤彩,而且比加減乘除優(yōu)先級高。
同時(shí)自增斧拍、自減運(yùn)算符的運(yùn)算數(shù)得是左值(可以放在賦值符號左邊的值)雀扶,而不能是常數(shù)

 4++; //ReferenceError: Invalid left-hand side expression in postfix operation
 var a=0,b=0;
 a+++b;//0
 a;//1,++優(yōu)先級比+高肆汹,所以相當(dāng)于(a++)+b=0+0=0 ,  因?yàn)閍++為0愚墓,a為1
 b;//0

3.賦值運(yùn)算符的優(yōu)先級相當(dāng)?shù)牡?/p>

 a = b == c; //等同于a = (b==c)

4.邏輯非!優(yōu)先級比加減乘除高,但邏輯與昂勉、邏輯或優(yōu)先級很低浪册,不如加減乘除

 !2*3; //0, 等價(jià)于(!2)*0, !2得false岗照,false與3相乘村象,即0*3得0

5.一個(gè)關(guān)于邏輯運(yùn)算符的有意思地方是其“短路”特點(diǎn). ||前面為ture,返回前面的值,為false谴返,返回后面的值煞肾。

&&前面為false,返回前面的值,為false,返回后面的值嗓袱。
||前面為ture,返回前面的值籍救,為false,返回后面的值渠抹。
! 如果操作數(shù)能夠轉(zhuǎn)換為true則返回false蝙昙;否則返回true闪萄。

能被轉(zhuǎn)換為false的值有null, 0, NaN, 空字符串("")和undefined。

 1 && 3;   得3
 1 && "foo" || 0; 得"foo"
 1 || "foo" && 0  得1奇颠,因?yàn)?amp;&優(yōu)先級高于||  相當(dāng)于 1 || ("foo" && 0 )

相等:==與===

===是嚴(yán)格意義的相等败去,只需注意NaN和NaN不等就行了。而使用==的時(shí)候烈拒,javascript會幫我們做類型轉(zhuǎn)換圆裕,造成一些匪夷所思的結(jié)果,那么使用==的時(shí)候會在哪些情況下做類型轉(zhuǎn)換荆几,又會換成什么樣子吓妆?

  • 如果兩個(gè)值類型相同,則執(zhí)行嚴(yán)格相等的運(yùn)算
  • 如果兩個(gè)值的類型不同
    1. 如果一個(gè)是null吨铸,一個(gè)是undefined行拢,那么相等
    2. 如果一個(gè)是數(shù)字,一個(gè)是字符串诞吱,先將字符串轉(zhuǎn)為數(shù)字舟奠,然后比較
    3. 如果一個(gè)值是true/false則將其轉(zhuǎn)為1/0比較
    4. 如果一個(gè)值是對象,一個(gè)是數(shù)字或字符串房维,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
    5. 其它就不相等了
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沼瘫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咙俩,更是在濱河造成了極大的恐慌晕鹊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暴浦,死亡現(xiàn)場離奇詭異,居然都是意外死亡晓锻,警方通過查閱死者的電腦和手機(jī)歌焦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砚哆,“玉大人独撇,你說我怎么就攤上這事≡晁” “怎么了纷铣?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長战转。 經(jīng)常有香客問我搜立,道長,這世上最難降的妖魔是什么槐秧? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任啄踊,我火速辦了婚禮忧设,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颠通。我一直安慰自己址晕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布顿锰。 她就那樣靜靜地躺著谨垃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硼控。 梳的紋絲不亂的頭發(fā)上刘陶,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音淀歇,去河邊找鬼易核。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浪默,可吹牛的內(nèi)容都是我干的牡直。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼纳决,長吁一口氣:“原來是場噩夢啊……” “哼碰逸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阔加,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饵史,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后胜榔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胳喷,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年夭织,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吭露。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尊惰,死狀恐怖讲竿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弄屡,我是刑警寧澤题禀,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站膀捷,受9級特大地震影響迈嘹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜全庸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一江锨、第九天 我趴在偏房一處隱蔽的房頂上張望吃警。 院中可真熱鬧,春花似錦啄育、人聲如沸酌心。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽安券。三九已至,卻和暖如春氓英,著一層夾襖步出監(jiān)牢的瞬間侯勉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工铝阐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留址貌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓徘键,卻偏偏與公主長得像练对,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子吹害,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容