摘要:跳過第二個(gè)運(yùn)算子的機(jī)制,被稱為短路有些程序員喜歡用它取代結(jié)構(gòu)等價(jià)于運(yùn)算符可以多個(gè)連用返回第一個(gè)布爾值為的表達(dá)式的值。
一、運(yùn)算符概述 1、定義
JavaScript中運(yùn)算符主要用于連接簡(jiǎn)單表達(dá)式,組成一個(gè)復(fù)雜的表達(dá)式
2、運(yùn)算符類別算數(shù)運(yùn)算符
賦值表達(dá)式
比較表達(dá)式
布爾運(yùn)算符
位運(yùn)算符
二、算數(shù)運(yùn)算符 1、加法運(yùn)算符(Addition):x + y加法運(yùn)算符是在運(yùn)行時(shí)決定,到底是執(zhí)行相加,還是執(zhí)行連接。也就是說,運(yùn)算子的不同,導(dǎo)致了不同的語法行為,這種現(xiàn)象稱為“重載”(overload)
(1)、在兩個(gè)操作數(shù)都是數(shù)字的時(shí)候,會(huì)做加法運(yùn)算
console.log(2+4);//6
(2)、兩個(gè)參數(shù)都是字符串或在有一個(gè)參數(shù)是字符串的情況下,會(huì)把另外一個(gè)參數(shù)轉(zhuǎn)換為字符串做字符串拼接
console.log("2"+"4");//"24"
"3" + 4 + 5 // "345" 3 + 4 + "5" // "75"
(3)、在參數(shù)有對(duì)象的情況下
3.1首先自動(dòng)調(diào)用對(duì)象的valueOf方法
一般來說,對(duì)象的valueOf方法總是返回對(duì)象自身,,也可自定義
3.2再自動(dòng)調(diào)用對(duì)象的toString方法,將其轉(zhuǎn)為字符串(如果valueOf方法直接返回一個(gè)原始類型的值,就不會(huì)調(diào)用tostring)
對(duì)象的toString方法默認(rèn)返回[object Object],也可自定義
var obj = { p: 1 }; obj + 2 // "[object Object]2"
3.3自定義valueOf方法或toString方法,得到想要的結(jié)果
var obj = { valueOf: function () { return 1; } }; obj + 2 // 3
var obj = { toString: function () { return "hello"; } }; obj + 2 // "hello2"
3.4 Date對(duì)象特例
如果運(yùn)算子是一個(gè)Date對(duì)象的實(shí)例,那么會(huì)優(yōu)先執(zhí)行toString方法。
var obj = new Date(); obj.valueOf = function () { return 1 }; obj.toString = function () { return "hello" }; obj + 2 // "hello2"
(4)、在只有一個(gè)字符串參數(shù)和+號(hào)的時(shí)候會(huì)嘗試將其轉(zhuǎn)換為數(shù)字,轉(zhuǎn)換失敗輸出NaN
console.log(+"4");//4
+"ffffdffffd" NaN2、其他算術(shù)運(yùn)算符
對(duì)于其他運(yùn)算符,在運(yùn)算前都強(qiáng)制轉(zhuǎn)換數(shù)字,再運(yùn)算。對(duì)象就調(diào)用valueOf或者toString,如果不能轉(zhuǎn)換的,輸出NaN
減法運(yùn)算符(Subtraction): x - y
乘法運(yùn)算符(Multiplication): x * y
除法運(yùn)算符(Division):x / y
余數(shù)運(yùn)算符(Remainder):x % y
自增運(yùn)算符(Increment):++x(先加后賦值) 或者 x++(先賦值后加)
自減運(yùn)算符(Decrement):--x 或者 x--
求負(fù)運(yùn)算符(Negate):-x
數(shù)值運(yùn)算符(Convert to number): +x
賦值運(yùn)算符用于給變量賦值,最常見的賦值運(yùn)算符,當(dāng)然就是等號(hào),表達(dá)式x=y表示將y賦值給x。除此之外,JavaScript還提供其他11個(gè)賦值運(yùn)算符。
運(yùn)算時(shí)從右到左,如var z=y=x;
x += y // 等同于 x = x + y x -= y // 等同于 x = x - y x *= y // 等同于 x = x * y x /= y // 等同于 x = x / y x %= y // 等同于 x = x % y x >>= y // 等同于 x = x >> y x <<= y // 等同于 x = x << y x >>>= y // 等同于 x = x >>> y x &= y // 等同于 x = x & y x |= y // 等同于 x = x | y x ^= y // 等同于 x = x ^ y四、比較運(yùn)算符
比較運(yùn)算符比較兩個(gè)值,然后返回一個(gè)布爾值,表示是否滿足比較條件。
JavaScript提供了8個(gè)比較運(yùn)算符。
1、 == 比較兩個(gè)值是否相等
相等運(yùn)算符(==)會(huì)將它們轉(zhuǎn)換成同一個(gè)類型,再用嚴(yán)格相等運(yùn)算符進(jìn)行比較。
2、=== 嚴(yán)格相等,比較它們是否為同一個(gè)值(數(shù)據(jù)類型也要相同)
內(nèi)容較多,多帶帶寫了一篇文章去說相等和嚴(yán)格相等
3、!=不相等
4、!== 嚴(yán)格不相等
它的算法就是先求嚴(yán)格相等運(yùn)算符的結(jié)果,然后返回相反值。
5、其他比較運(yùn)算符(< 小于 <= 小于或等于 > 大于 >= 大于或等于)
5.1同為字符串按照Unicode 順序進(jìn)行比較
首先比較首字符的 Unicode 碼點(diǎn),如果相等,再比較第二個(gè)字符的 Unicode 碼點(diǎn),以此類推
5.2不全為字符串的比較,分成以下兩種情況
1)原始類型值(數(shù)值、字符串、布爾值)
如果兩個(gè)運(yùn)算子都是原始類型的值,則是先轉(zhuǎn)成數(shù)值再比較
5 > "4" // true // 等同于 5 > Number("4") // 即 5 > 4 true > false // true // 等同于 Number(true) > Number(false) // 即 1 > 0 2 > true // true // 等同于 2 > Number(true) // 即 2 > 1
2)有一方或者雙方為對(duì)象的比較
調(diào)用valueOf方法和toString方法,轉(zhuǎn)為原始類型的值,再進(jìn)行比較
var x = [2]; x > "11" // true // 等同于 [2].valueOf().toString() > "11" // 即 "2" > "11"
{ x: 2 } >= { x: 1 } // true // 等同于 { x: 2 }.valueOf().toString() >= { x: 1 }.valueOf().toString() // 即 "[object Object]" >= "[object Object]"五、布爾運(yùn)算符 1、! 取反運(yùn)算符
對(duì)數(shù)據(jù)取反,得到的都是布爾值!
2、&& 且運(yùn)算符1)用途:且運(yùn)算符(&&)往往用于多個(gè)表達(dá)式的求值。
2) 運(yùn)算規(guī)則是:如果第一個(gè)運(yùn)算子的布爾值為true,則返回第二個(gè)運(yùn)算子的值(注意是值,不是布爾值);如果第一個(gè)運(yùn)算子的布爾值為false,則直接返回第一個(gè)運(yùn)算子的值,且不再對(duì)第二個(gè)運(yùn)算子求值。
var x = 1; (1 - 1) && ( x += 1) // 0 x // 1
3)跳過第二個(gè)運(yùn)算子的機(jī)制,被稱為“短路”,有些程序員喜歡用它取代if結(jié)構(gòu)
if (i) { doSomething(); } // 等價(jià)于 i && doSomething();
4)運(yùn)算符可以多個(gè)連用
返回第一個(gè)布爾值為false的表達(dá)式的值。如果所有表達(dá)式的布爾值都為true,則返回最后一個(gè)表達(dá)式的值。
true && "foo" && "" && 4 && "foo" && true // "" 1 && 2 && 3 // 33、|| 或運(yùn)算符
1)運(yùn)算規(guī)則:
如果第一個(gè)運(yùn)算子的布爾值為true,則返回第一個(gè)運(yùn)算子的值,且不再對(duì)第二個(gè)運(yùn)算子求值;如果第一個(gè)運(yùn)算子的布爾值為false,則返回第二個(gè)運(yùn)算子的值
"t" || "f" // "t" "" || "f" // "f"
2)或運(yùn)算符可以多個(gè)連用
這時(shí)返回第一個(gè)布爾值為true的表達(dá)式的值。如果所有表達(dá)式都為false,則返回最后一個(gè)表達(dá)式的值。
false || 0 || "" || 4 || "foo" || true // 4 false || 0 || "" // ""4、condition? true case : false case 三元條件運(yùn)算符
1)簡(jiǎn)介:三元條件運(yùn)算符由問號(hào)(?)和冒號(hào)(:)組成,分隔三個(gè)表達(dá)式。
2)規(guī)則:如果第一個(gè)表達(dá)式的布爾值為true,則返回第二個(gè)表達(dá)式的值,否則返回第三個(gè)表達(dá)式的值。
console.log(true ? "T" : "F");六、位運(yùn)算符
就是把兩個(gè)做位運(yùn)算的值,都按照二進(jìn)制一位一位的按照符號(hào)規(guī)則進(jìn)行運(yùn)算
位運(yùn)算符只對(duì)整數(shù)起作用,如果一個(gè)運(yùn)算子不是整數(shù),會(huì)自動(dòng)轉(zhuǎn)為整數(shù)后再執(zhí)行
1、或運(yùn)算(or):
符號(hào)為|,表示兩個(gè)二進(jìn)制位中有一個(gè)為1,則結(jié)果為1,否則為0。
0000 0010 | 0000 0001 就等0000 0011(3)
2、與運(yùn)算(and):
符號(hào)為&,表示兩個(gè)二進(jìn)制位都為1,則結(jié)果為1,否則為0。
0000 0010 & 0000 0001 就等0000 0000(0)
3、否運(yùn)算(not):
符號(hào)為~,表示將一個(gè)二進(jìn)制位變成相反值。
~ 0000 0010 就等于1111 1101
4、異或運(yùn)算(xor):
符號(hào)為?,表示兩個(gè)二進(jìn)制位中有且僅有一個(gè)為1時(shí),結(jié)果為1,否則為0。
5、左移運(yùn)算(left shift):符號(hào)為<<
1(數(shù)值)<<1(左移的位數(shù)) //2 1<<2 //4 1<<3 //8
6、右移運(yùn)算(right shift):符號(hào)為>>
8>>1 //4
7、帶符號(hào)位的右移運(yùn)算(zero filled right shift):符號(hào)為>>>
七、其他運(yùn)算符 1、()小括號(hào)圓括號(hào)是一種運(yùn)算符,它有兩種用法:
1)如果把表達(dá)式放在圓括號(hào)之中,作用是求值
2)如果跟在函數(shù)的后面,作用是調(diào)用函數(shù)。
逗號(hào)運(yùn)算符用于對(duì)兩個(gè)表達(dá)式求值,并返回后一個(gè)表達(dá)式的值。
var x = 0; var y = (x++, 10); x // 1 y // 10八、運(yùn)算符的優(yōu)先級(jí)
運(yùn)算符的優(yōu)先級(jí),建議還是查看mdn。全部記住很難,簡(jiǎn)單理一下順序,加深直覺(不準(zhǔn)確喲)
自增 > 邏輯非>typeof > 加減乘除 > 判斷大?。?<=) >邏輯運(yùn)算(與或)>三元條件運(yùn)算符 >賦值 >,)
1、typeof的優(yōu)先級(jí)相當(dāng)?shù)母?/strong>,比加減乘除神馬的都高,所以雖然是操作符,在在復(fù)雜表達(dá)式的時(shí)候我們還是習(xí)慣加括號(hào),看個(gè)例子
typeof 2*3;//NaN typeof (2*3);//"number" typeof 2+3;// "number3"
2、 ++、--是右結(jié)合的操作符(優(yōu)先級(jí)最高的幾個(gè)都是右結(jié)合),而且比加減乘除優(yōu)先級(jí)高。同時(shí)自增、自減運(yùn)算符的運(yùn)算數(shù)得是左值(可以放在賦值符號(hào)左邊的值),而不能是常數(shù)
var a=0,b=0; a+++b;//0 a;//1,a++優(yōu)先級(jí)比++b高,所以相當(dāng)于(a++)+b b;//0
3、賦值運(yùn)算符的優(yōu)先級(jí)相當(dāng)?shù)牡?/strong>
a = b == c; //等同于a = (b==c)
4、邏輯非!也在優(yōu)先級(jí)隊(duì)列的前端,比加減乘除高,但邏輯與、邏輯或優(yōu)先級(jí)很低,不如加減乘除
!2*0; //0, 等價(jià)于(!2)*0
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108649.html
摘要:對(duì)于與的設(shè)計(jì)在中所設(shè)計(jì)的純對(duì)象類型的與方法,它們的返回如下方法返回值對(duì)象本身。與三個(gè)強(qiáng)制轉(zhuǎn)換函數(shù),所對(duì)應(yīng)的就是在標(biāo)準(zhǔn)中的三個(gè)內(nèi)部運(yùn)算轉(zhuǎn)換的對(duì)照表。 在JS中的運(yùn)算符共同的情況中,(+)符號(hào)是很常見的一種,它有以下的使用情況: 數(shù)字的加法運(yùn)算,二元運(yùn)算 字符串的連接運(yùn)算,二元運(yùn)算,最高優(yōu)先 正號(hào),一元運(yùn)算,可延伸為強(qiáng)制轉(zhuǎn)換其他類型的運(yùn)算元為數(shù)字類型 當(dāng)然,如果考慮多個(gè)符號(hào)一起使用時(shí),...
摘要:在設(shè)計(jì)時(shí),有兩種比較運(yùn)算符第一種是比較,它會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型再比較,很多時(shí)候,會(huì)得到非常詭異的結(jié)果第二種是比較,它不會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型,如果數(shù)據(jù)類型不一致,返回,如果一致,再比較。 數(shù)據(jù)類型和變量 數(shù)據(jù)類型計(jì)算機(jī)顧名思義就是可以做數(shù)學(xué)計(jì)算的機(jī)器,因此,計(jì)算機(jī)程序理所當(dāng)然地可以處理各種數(shù)值。但是,計(jì)算機(jī)能處理的遠(yuǎn)不止數(shù)值,還可以處理文本、圖形、音頻、視頻、網(wǎng)頁等各種各樣的數(shù)據(jù),不同的數(shù)據(jù)...
摘要:在中的關(guān)系比較運(yùn)算,指的是像這種大小值的關(guān)系比較。而相等比較,可區(qū)分為標(biāo)準(zhǔn)相等比較與嚴(yán)格相等比較兩大種類。 在JS中的關(guān)系比較(Relational Comparison)運(yùn)算,指的是像x < y這種大小值的關(guān)系比較。 而相等比較,可區(qū)分為標(biāo)準(zhǔn)相等(standard equality)比較x == y與嚴(yán)格相等(strict equality)比較x === y兩大種類。嚴(yán)格相等比較會(huì)...
摘要:中的基本數(shù)據(jù)類型有種,引用數(shù)據(jù)類型則是指除了上述基本數(shù)據(jù)類型以外的所有值,比如隱式類型轉(zhuǎn)換加法的隱式轉(zhuǎn)換轉(zhuǎn)換為原始值當(dāng)需要轉(zhuǎn)換為原始值時(shí),引擎內(nèi)部會(huì)進(jìn)行抽象操作。 showImg(https://segmentfault.com/img/bVbqjVM); 基本運(yùn)算規(guī)則 +的使用有兩種情況 當(dāng)+連接兩個(gè)變量或值時(shí)即為二元運(yùn)算符,比如a + b,當(dāng)+在變量或值前面時(shí),則為一元運(yùn)算符,比...
摘要:介紹編程數(shù)據(jù)結(jié)構(gòu),算法,內(nèi)存分配表單驗(yàn)證需要一門語言可以直接運(yùn)行在瀏覽器中,來完成表單驗(yàn)證的功能。 Javascript介紹編程(數(shù)據(jù)結(jié)構(gòu),算法,內(nèi)存分配)表單驗(yàn)證 需要一門語言可以直接運(yùn)行在瀏覽器中,來完成表單驗(yàn)證的功能。 瀏覽器廠商 網(wǎng)景 firefox js 標(biāo)準(zhǔn) js解釋器 IE js js解釋器 google js j...
閱讀 2027·2019-08-30 15:52
閱讀 2990·2019-08-29 16:09
閱讀 1333·2019-08-28 18:30
閱讀 2464·2019-08-26 12:24
閱讀 1109·2019-08-26 12:12
閱讀 2284·2019-08-26 10:45
閱讀 580·2019-08-23 17:52
閱讀 845·2019-08-23 16:03