原文
大綱
前言
1拒炎、一元操作符
2、位操作符
3挨务、布爾操作符(邏輯操作符)
4击你、乘性操作符
5、加性操作符
6谎柄、關(guān)系操作符(比較運(yùn)算符)
7果漾、相等操作符(比較運(yùn)算符)
8、條件操作符
9谷誓、賦值操作符
10绒障、逗號操作符
前言
ECMAScript描述了一組用于操作數(shù)據(jù)值的操作符,包括算數(shù)操作符(如加號和減號)捍歪、位操作符户辱、關(guān)系操作符和相等操作符鸵钝。ECMAScript操作符的與眾不同之處在于,它們能夠適用于很多值庐镐,例如字符串恩商、數(shù)字值、布爾值必逆,甚至對象怠堪。不過,在應(yīng)用于對象時(shí)名眉,相應(yīng)的操作符通常都會調(diào)用對象的valueOf()和(或)toString()方法粟矿,以便取得可以操作的值。
1损拢、一元操作符
1.1陌粹、一元操作符:只能操作一個(gè)操作一個(gè)數(shù)的操作符叫做一元操作符。
1.2福压、一元操作符有遞增掏秩、遞減、一元加荆姆、一元減蒙幻、delete、void胆筒、typeof杆煞、按位非(~)、按位與(8骸)决乎。
1.3、遞增有前置遞增和后置遞增派桩,遞減有前置遞減也有后置遞減
1.4构诚、遞增和遞減操作符對任何類型的數(shù)據(jù)都是有效的,若遇到不是Number類型铆惑,會先將其轉(zhuǎn)換其Number的類型范嘱,轉(zhuǎn)換方法和轉(zhuǎn)型函數(shù)Number()一致。
1.5员魏、一元加和一元減主要用于基本的算數(shù)運(yùn)算丑蛤,其主要是轉(zhuǎn)換數(shù)據(jù)的正負(fù)性,對任何類型的數(shù)據(jù)都有效撕阎,若不是Number類型受裹,將按照Number()的轉(zhuǎn)換方式將其先轉(zhuǎn)換成Number類型。
2、位操作符
2.1棉饶、位操作符用于最基本的層次上厦章,即按內(nèi)存中表示數(shù)值的位來操作數(shù)值。
2.2照藻、位操作符并不直接操作64位的值袜啃,而是先將64位的值轉(zhuǎn)換成32位的整數(shù),然后執(zhí)行操作幸缕,最后再將結(jié)果轉(zhuǎn)換回64位群发。對于開發(fā)人員來說,由于64位存儲格式是透明的发乔,因此整個(gè)過程就像是只存在32位的整數(shù)一樣熟妓。
2.3、ECMAScript會盡力向我們隱藏所有這些信息列疗,換句話說滑蚯,在以二進(jìn)制字符串輸出一個(gè)負(fù)數(shù)時(shí)浪蹂,我們看到的只是這個(gè)負(fù)數(shù)絕對值的二進(jìn)制碼前面加上了一個(gè)負(fù)號抵栈。
2.4、由于運(yùn)算的過程中會將64位數(shù)值轉(zhuǎn)換為32位數(shù)值坤次,而這個(gè)轉(zhuǎn)換過程的副效應(yīng)是在對特殊的值:NaN和Infinity值的時(shí)候古劲,會將其當(dāng)做0來處理。
2.5缰猴、對于非Number的數(shù)值产艾,會先使用Number()方法將其轉(zhuǎn)換成Number類型再進(jìn)行位運(yùn)算。
2.6滑绒、位操作符主要有:
/*
按位非(NOT)
按位非操作的本質(zhì):操作數(shù)的負(fù)值減1,但是按位非是在數(shù)值表示的最底層執(zhí)行操作闷堡,因此速度更快
*/
var num1 = 25;
var num2 = ~num1;
console.log(num2);//-26
var num3 = -num1 -1
console.log(num3);//-26
/*
按位與(AND)
*/
var num1 = 25 & 3;
console.log(num1);//1
/*
按位或(OR)
*/
var num1 = 25 | 3;
console.log(num1);//27
/*
按位異或(XOR)
*/
var num1 = 25 ^ 3;
console.log(num1);//26
/*
左移(<<)
左移的本質(zhì)是將要左移的數(shù)乘以2的左移次方的結(jié)果
*/
var num1 = 2;
var num2 = num1 << 5;
console.log(num2);//64
console.log(2*32);//64//2^5=32
var num1 = 7;
var num2 = num1 << 5;
console.log(num2);//224
console.log(7*32);//224
/*
有符號的右移(>>)
*/
var num1 = 64;
var num2 = num1 >> 5;
console.log(num2);
console.log(64/32);//2^5=32
/*
無符號右移(>>>)
*/
var num1 = 64;
var num2 = num1 >>> 5;
console.log(num2);
console.log(64/32);//2^5=32
3、布爾操作符(邏輯操作符)
布爾操作符一共有3個(gè):非(NOT)疑故、與(AND)杠览、或(OR)
3.1、邏輯非(!)
邏輯非操作符首先會將它的操作數(shù)轉(zhuǎn)換為一個(gè)布爾值,然后再對其求反灵奖。
邏輯非操作符可以用于將一個(gè)值轉(zhuǎn)換為與其對應(yīng)的布爾值震蒋,通過同時(shí)使用兩個(gè)邏輯非操作符來
達(dá)到Boolean()的效果
邏輯非操作符遵循下列規(guī)則:
如果操作數(shù)是一個(gè)對象,返回false;
如果操作數(shù)是一個(gè)空字符串锰茉,返回true;
如果操作數(shù)是一個(gè)非空字符串,返回false;
如果操作數(shù)是數(shù)值0,返回true;
如果操作數(shù)是任意非0數(shù)值(包括Infinity),返回false;
如果操作數(shù)是null,返回true;
如果操作數(shù)是NaN,返回true;
如果操作數(shù)是undefined,返回true
3.2佛点、邏輯與(&&)
邏輯與操作可以應(yīng)用于任何類型的操作數(shù),而不僅僅是布爾值黎比。在有一個(gè)操作數(shù)不是布爾值的
情況下恋脚,邏輯與操作就不一定返回布爾值腺办;此時(shí),他遵循下列規(guī)則:
邏輯與操作屬于短路操作糟描,即如果第一個(gè)操作數(shù)能夠決定結(jié)果怀喉,那么就不會再對第二個(gè)操作
數(shù)求值。即如果第一個(gè)操作數(shù)是false船响,那么返回false躬拢,下列的操作也就沒有了。
如果第一個(gè)操作數(shù)是對象见间,則返回第二個(gè)操作數(shù)
如果第二個(gè)操作數(shù)是對象聊闯,則只有在第一個(gè)操作數(shù)的求值結(jié)果為true的情況下才會返回
該對象
如果兩個(gè)操作數(shù)都是獨(dú)享,則返回第二個(gè)操作數(shù)
如果有一個(gè)操作數(shù)是null米诉,則返回null
如果有一個(gè)操作數(shù)是NaN菱蔬,則返回NaN
如果有一個(gè)操作數(shù)是undefined,則返回undefined
3.3史侣、邏輯或(||)
與邏輯與操作相似拴泌,如果有一個(gè)操作數(shù)不是布爾值,邏輯或也不一定返回布爾值惊橱;此時(shí)蚪腐,它
遵循下列規(guī)則:
邏輯非操作符是短路操作符,也就是說税朴,如果第一個(gè)操作數(shù)的求值結(jié)果為true回季,就不會對第
二個(gè)操作數(shù)求值了,也就不會對下列操作進(jìn)行判斷了
如果第一個(gè)操作數(shù)是對象正林,則返回第一個(gè)操作數(shù)
如果第一個(gè)操作數(shù)的求值結(jié)果為false泡一,則返回第二個(gè)操作數(shù)
如果兩個(gè)操作數(shù)都是對象,則返回第一個(gè)操作數(shù)
如果兩個(gè)操作數(shù)都是null觅廓,則返回null
如果兩個(gè)操作數(shù)都是NaN鼻忠,則返回NaN
如果兩個(gè)操作數(shù)都是undefined,則返回undefined
4哪亿、乘性操作符
乘性操作有:乘法粥烁、除法、求模
在操作非數(shù)值的情況下蝇棉,會先將非數(shù)值的數(shù)據(jù)通過Number()的方法將其轉(zhuǎn)換成數(shù)值類型再進(jìn)行計(jì)算
4.1讨阻、乘法
如果乘積超過了ECMAScript數(shù)值的表示范圍,則返回Infinity和-Infinity
如果有一個(gè)操作數(shù)是NaN篡殷,則結(jié)果是NaN
如果是Infinity與0相乘钝吮,則結(jié)果是NaN
如果是Infinity與非0數(shù)值相乘,則結(jié)果是Infinity或-Infinity,取決于有符號操作數(shù)
的符號
如果是Infinity與Infinity相乘奇瘦,則結(jié)果是Infinity
如果有一個(gè)操作數(shù)不是數(shù)值棘催,則在后臺調(diào)用Number()將其轉(zhuǎn)換為數(shù)值,然后再應(yīng)用上面的
規(guī)則.
4.2耳标、除法
如果商超過了ECMAScript數(shù)值的表示范圍醇坝,則返回Infinity或-Infinity
如果有一個(gè)操作數(shù)是NaN,則結(jié)果是NaN
如果是Infinity被Infinity除,則結(jié)果是NaN
如果是零被零除次坡,則結(jié)果是NaN
如果是非零的有限數(shù)被零除呼猪,則結(jié)果是Infinity或-Infinity,取決于有符號操作數(shù)的符號
如果是Infinity被任何非零數(shù)值除砸琅,則結(jié)果是Infinity或-Infinity宋距,取決于有符號操作數(shù)
的符號
4.3、求模
如果被除數(shù)是無窮大值而除數(shù)是有限大的數(shù)值症脂,則結(jié)果是NaN
如果被除數(shù)是有限大的數(shù)值而除數(shù)是零谚赎,則結(jié)果是NaN
如果是Infinity被Infinity除,則結(jié)果是NaN
如果被除數(shù)是有限大的數(shù)值而除數(shù)是無窮大的數(shù)值诱篷,則結(jié)果是被除數(shù)
如果被除數(shù)是零壶唤,則結(jié)果是零
5、加性操作符
加性操作有:加法兴蒸、減法
5.1视粮、加法
如果兩個(gè)操作數(shù)都是數(shù)值细办,則執(zhí)行常規(guī)的加法計(jì)算橙凳,有如下特殊規(guī)則
如果有一個(gè)操作數(shù)是NaN,則結(jié)果是NaN
如果是Infinity加Infinity笑撞,則結(jié)果是Infinity
如果是-Infinity加-Infinity岛啸,則結(jié)果是-Infinity
如果是Infinity加-Infinity,則結(jié)果是NaN
如果是+0加+0茴肥,則結(jié)果是+0
如果是-0加-0坚踩,則結(jié)果是-0
如果是+0加-0,則結(jié)果是+0
如果有一個(gè)操作數(shù)是字符串瓤狐,那么就有如下規(guī)則
如果操作數(shù)都是字符串瞬铸,則將兩個(gè)字符串拼接起來
如果有一個(gè)操作數(shù)是字符串,另一個(gè)不是字符串础锐,則會通過toString()方法獲取相應(yīng)的字符
串嗓节,然后再將其拼接起來
5.2、減法
同樣的皆警,減法對于數(shù)據(jù)的操作也有其特殊性
如果有一個(gè)操作數(shù)是NaN拦宣,則結(jié)果是NaN
如果是Infinity減Infinity,則結(jié)果是NaN
如果是-Infinity減-Infinity,則結(jié)果是NaN
如果是Infinity減-Infinity鸵隧,則結(jié)果是Infinity
如果是-Infinity減Infinity绸罗,則結(jié)果是-Infinity
如果是+0減+0,則結(jié)果是+0
如果是+0減-0豆瘫,則結(jié)果是-0
如果是-0減-0珊蟀,則結(jié)果是+0
6、關(guān)系操作符(比較運(yùn)算符)
關(guān)系操作符:< 外驱、> 系洛、 <= 、>=
6.1略步、不同類型數(shù)據(jù)之間的比較
如果兩個(gè)操作數(shù)都是數(shù)值描扯,則執(zhí)行數(shù)值比較
如果兩個(gè)操作數(shù)都是字符串,則比較兩個(gè)字符串對應(yīng)的字符編碼值(從頭一一對比趟薄,有結(jié)果
就停止)
如果一個(gè)操作數(shù)是數(shù)值绽诚,則將另一個(gè)操作數(shù)轉(zhuǎn)換成一個(gè)數(shù)值,然后進(jìn)行比較
如果一個(gè)操作數(shù)是對象杭煎,則調(diào)用對象的valueOf()方法恩够,用得到的結(jié)果執(zhí)行比較,如果沒有
valueOf()則調(diào)用toString()方法羡铲,用得到的結(jié)果執(zhí)行操作
如果一個(gè)操作數(shù)是布爾值蜂桶,則將其轉(zhuǎn)換為數(shù)值,然后再比較
任何操作數(shù)與NaN進(jìn)行比較也切,結(jié)果都是false
7扑媚、相等操作符(比較運(yùn)算符)
相等操作符有相等、不相等(——先轉(zhuǎn)換再比較)和全等雷恃、不全等(——僅比較不轉(zhuǎn)換)疆股。
7.1、如果是不同數(shù)據(jù)類型倒槐,比較之前需要進(jìn)行轉(zhuǎn)型操作
如果有一個(gè)操作數(shù)是布爾值旬痹,則在比較的時(shí)候先將其轉(zhuǎn)換為數(shù)值,false為0讨越,true為1
如果一個(gè)操作數(shù)是字符串两残,則另一個(gè)操作數(shù)是數(shù)值,則比較之前先將字符串轉(zhuǎn)換為數(shù)值
如果一個(gè)操作數(shù)是對象把跨,另一個(gè)不是人弓,則調(diào)用對象的valueOf()方法,得到基本數(shù)據(jù)類型再按
前面的規(guī)則比較
7.2节猿、特殊值的特殊比較
null和undefined是相等的
要比較相等性之前票从,不能將null和undefined轉(zhuǎn)換成其他任何職
如果有一個(gè)操作數(shù)是NaN漫雕,則相等操作符返回false,即使兩個(gè)操作數(shù)都是NaN峰鄙,也返回false
如果兩個(gè)操作數(shù)都是對象浸间,則比較他們是不是同一個(gè)對
象,如果兩個(gè)操作數(shù)都指向同一個(gè)對象吟榴,則相等
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined ==0 false
null == 0 false
"5" == 5 true
7.3魁蒜、全等和不全等
除了在比較之前不轉(zhuǎn)換數(shù)據(jù)類型之外,全等和不全等操作符與相等和不相等操作符沒有什么區(qū)別吩翻。
由于相等和不相等操作符存在類型轉(zhuǎn)換問題兜看,而為了保持代碼中數(shù)據(jù)類型的完整性,我們推薦使用全等和不全等操作符狭瞎。
8细移、條件操作符
條件操作符算是ECMAScript最靈活的一種操作符
var variable = boolean_expression ? true_value : false_value;
求最大值
var max = (num1 > num2) ? num1 : num2;
9、賦值操作符
簡單的賦值操作符由等于號(=)表示熊锭,其作用就是把右側(cè)的值賦給左側(cè)的變量弧轧。
var num = 10;
10、逗號操作符
使用逗號操作符可以在一條語句中執(zhí)行多個(gè)操作碗殷,如下面的例子所示:
var num1=1,num2=2,num3=3
逗號操作符多用于聲明多個(gè)變量精绎;但除此之外,逗號操作符還可以用于賦值锌妻。在用于賦值時(shí)代乃,逗號操作符總會返回表達(dá)式中的最后一項(xiàng),如下面的例子所示:
var num = (5,1,5,8,0);//num的值為0