JS中的操作符與其他語(yǔ)言大體上是相似的符匾,這里總結(jié)一些需要注意的地方.
一元操作符
- 一元加(+)
在數(shù)值前面放置+
對(duì)數(shù)值沒(méi)有任何影響真竖,對(duì)非數(shù)值使用+
框都,具有Number()
轉(zhuǎn)型函數(shù)的效果. - 一元減(-)操作符
應(yīng)用于數(shù)值镣隶,該值會(huì)變成負(fù)數(shù).應(yīng)用于非數(shù)值魂那,會(huì)先遵循與+
相同的規(guī)則,然后轉(zhuǎn)換為負(fù)數(shù)
布爾操作符
- 邏輯非(!)
在對(duì)非Boolean類型的數(shù)據(jù)使用邏輯非锌蓄,會(huì)先轉(zhuǎn)換為布爾值升筏,再求反。
所以使用兩個(gè)!
速度會(huì)模擬Boolean()
的行為. - 邏輯與(&&)
在有一個(gè)操作數(shù)不是布爾值的情況下瘸爽,邏輯與操作不一定返回布爾值您访,遵循以下規(guī)則:
- 第一個(gè)是對(duì)象,返回第二個(gè)操作數(shù)
- 第二個(gè)是對(duì)象剪决,則只有第一個(gè)是true時(shí)才返回該對(duì)象
- 第一個(gè)是
null, undefined, NaN
,則返回相應(yīng)的null, undefined, NaN
- 邏輯或(||)
在有一個(gè)操作數(shù)不是布爾值的情況下灵汪,不一定會(huì)返回布爾值,遵循以下規(guī)則:
- 第一個(gè)是對(duì)象柑潦,則返回第一個(gè)操作數(shù)
- 第一個(gè)求值結(jié)果為false,則返回第二個(gè)操作數(shù)
- 兩個(gè)操作數(shù)都是
null, undefined, NaN
,則返回相應(yīng)的null, undefined, NaN
乘性操作符
在操作數(shù)不為數(shù)值的時(shí)候享言,會(huì)執(zhí)行自動(dòng)的類型轉(zhuǎn)換.
乘法()
除了"遵循NaN參與的任何操作,結(jié)果都是NaN"*之外渗鬼,其他情況大部分都是正常值或者Infinity
或-Infinity
.
只有一種情況: Infinity與0相乘览露,結(jié)果為NaN除法(/)
有兩種情況是NaN
- 零被零除--> NaN
- Infinity 被 Infinity 除--> NaN
- 取模(%)
- 被除數(shù)無(wú)窮大而除數(shù)有限大,則為NaN
- 被除數(shù)無(wú)窮大而除數(shù)為0譬胎,則為NaN
- Infinity被Infinity除差牛,則為NaN
- 被除數(shù)有限大而除數(shù)無(wú)窮大命锄,結(jié)果為被除數(shù)
- 被除數(shù)為0,結(jié)果為0
加性操作符
- 加法
- Infinity加-Infinity多糠,結(jié)果為NaN
- 有一個(gè)是字符串累舷,則另一個(gè)數(shù)轉(zhuǎn)換為字符串浩考,然后拼接
- 如果有一個(gè)操作數(shù)是對(duì)象或者數(shù)值或布爾值夹孔,另一個(gè)操作數(shù)是字符串,則將非字符串轉(zhuǎn)換為字符串析孽,對(duì)于undefined和null搭伤,使用
String()
轉(zhuǎn)換為字符串
- 減法
- Infinity - Infinity = NaN
- -Infinity - (-Infinity) = NaN
- 有一個(gè)操作數(shù)是數(shù)值,另一個(gè)操作數(shù)為非數(shù)值袜瞬,則轉(zhuǎn)換為數(shù)值.
總結(jié):加法中怜俐,如果有一個(gè)字符串,則優(yōu)先將另一個(gè)轉(zhuǎn)換為字符串邓尤,減法中拍鲤,如果有一個(gè)是數(shù)值,則優(yōu)先將另一個(gè)轉(zhuǎn)換為數(shù)值
關(guān)系操作符
關(guān)系操作符有小于(<),大于(>),小于等于(<=)和大于等于(>=),優(yōu)先比較的數(shù)據(jù)類型是數(shù)值汞扎,返回布爾值
- 兩個(gè)操作數(shù)都是數(shù)值季稳,則比較數(shù)值大小
- 兩個(gè)操作數(shù)都是字符串,則比較第一個(gè)字符的編碼
- 有一個(gè)數(shù)值澈魄,將另一個(gè)轉(zhuǎn)換為數(shù)值景鼠,進(jìn)行比較
- 注意:比較時(shí) null轉(zhuǎn)換為0 ,undefined轉(zhuǎn)換為NaN
相等操作符
主要分為相等(==)和全等(===),區(qū)別在于相等操作符操作之前會(huì)進(jìn)行類型的轉(zhuǎn)換痹扇,全等操作符不會(huì)進(jìn)行類型轉(zhuǎn)換铛漓。
相等操作符優(yōu)先進(jìn)行數(shù)值的比較
- 一個(gè)操作數(shù)是字符串,另一個(gè)是數(shù)值鲫构,則轉(zhuǎn)換為數(shù)值再比較
- 一個(gè)是對(duì)象浓恶,則調(diào)用
valueOf()
方法,再比較 - 在比較相等性之前结笨,null和undefined不能轉(zhuǎn)換為其他任何值问顷,而在關(guān)系比較時(shí),null會(huì)轉(zhuǎn)換為0禀梳,undefined會(huì)轉(zhuǎn)換為NaN
如下
var a = null;
console.log(a == 0); //false,因?yàn)閚ull不能轉(zhuǎn)化為其他
console.log(a >= 0); // true, 因?yàn)樵陉P(guān)系操作符中杜窄,null轉(zhuǎn)換為0
console.log(a <= 0); // true, 因?yàn)樵陉P(guān)系操作符中,null轉(zhuǎn)換為0
- 在對(duì)象的比較中算途,只有兩個(gè)操作數(shù)指向同一個(gè)對(duì)象塞耕,才會(huì)返回true
- 全等(===)操作符則兩個(gè)操作數(shù)必須完全相同才會(huì)返回true
條件操作符
就是常見(jiàn)的expression ? true_value : false_value
了
賦值操作符
*=
/=
+=
-=
%=
<<=
>>=
-
>>>=
這些操作符只是簡(jiǎn)單而已,沒(méi)有性能上的提升
逗號(hào)操作符
使用逗號(hào)操作符可以在一條語(yǔ)句中執(zhí)行多個(gè)操作
var num = 1,num2 = 2,num3 = 3;
還可以用于賦值嘴瓤,在用于賦值時(shí)扫外,總會(huì)返回最后一項(xiàng)
var num = (5,4,3,2,0); // num的值為0