以下內(nèi)容可能存在個(gè)人理解的部分,并非完全參照原文
如有疑問,請以書中內(nèi)容為準(zhǔn)
接著上一篇的內(nèi)容
加性操作符
對于加性操作符而言,轉(zhuǎn)換規(guī)則稍微有點(diǎn)復(fù)雜。
1.加法
如果兩個(gè)操作數(shù)都是數(shù)值,按常規(guī)加法進(jìn)行計(jì)算:
- 如果有一個(gè)操作數(shù)是
NaN,則結(jié)果是NaN - 如果是
Infinity加Infinity,則結(jié)果是Infinity - 如果是
Infinity加-Infinity,則結(jié)果是NaN
如果有一個(gè)操作數(shù)是字符串,那么將另外一個(gè)操作數(shù)轉(zhuǎn)換為字符串,然后再將兩個(gè)字符串拼接起來。
var res1 = 5 + 5; // 10
var res2 = 5 + "5"; // "55"
如果另一個(gè)操作數(shù)是對象,則調(diào)用它的toString()方法
2.減法
同樣如果兩個(gè)操作數(shù)都是數(shù)值,按常規(guī)減法計(jì)算:
- 如果有一個(gè)操作數(shù)是
NaN,則結(jié)果是NaN - 如果是
Infinity減Infinity,則結(jié)果是NaN - 如果是
Infinity減-Infinity,則結(jié)果是Infinity
這里不同的是,如果有一個(gè)操作數(shù)是字符串、布爾值、null或undefined,則先用Number()轉(zhuǎn)換為數(shù)值類型
如果有一個(gè)操作數(shù)是對象,則調(diào)用對象的valueOf()方法以取得表示該對象的數(shù)值。如果沒有valueOf()方法則調(diào)用toString()方法再將獲得的字符串轉(zhuǎn)換為數(shù)值。
也就是說,減法優(yōu)先轉(zhuǎn)換為數(shù)值類型
關(guān)系操作符
小于<、大于>、小于等于<=、大于等于>=比較規(guī)則和數(shù)學(xué)中相同
轉(zhuǎn)換規(guī)則:
- 如果兩個(gè)操作數(shù)都是字符串,則比較兩個(gè)字符串對應(yīng)的字符編碼值
- 如果有一個(gè)操作數(shù)是數(shù)值,則將另一個(gè)操作數(shù)轉(zhuǎn)換為數(shù)值比較
- 如果有一個(gè)操作數(shù)是對象,則調(diào)用這個(gè)對象的
valueOf()方法進(jìn)行比較,沒有則調(diào)用toString()方法 - 如果有一個(gè)操作數(shù)是布爾值,則先將其轉(zhuǎn)換為數(shù)值,然而再執(zhí)行比較
這里的規(guī)則很復(fù)雜,會引起很多奇怪的現(xiàn)象:
var res = "Brick" < "alphabet"; // true
原因是字母B的字符編碼為66,而字母a的字符編碼是97。如果真要按字母表順序比較字符串,就必須把兩個(gè)操作數(shù)轉(zhuǎn)換為相同大小寫。
var res = "Brick".toLowerCase() < "alphabet".toLowerCase(); // false
另一個(gè)奇怪的現(xiàn)象發(fā)生再比較兩個(gè)數(shù)字字符串的情況下:
var res = "23" < "3"; // true
因?yàn)閮蓚€(gè)操作數(shù)都是字符串,會比較字符編碼大小。
var res = "23" < 3; // false
此時(shí),字符串"23"會被轉(zhuǎn)換成23。
根據(jù)規(guī)則,任何操作數(shù)與NaN進(jìn)行關(guān)系比較,結(jié)果都是false
var res1 = NaN < 3; // false
var res2 = NaN >= 3; // false
相等操作符
1.相等(==)和不相等(!=)
這兩個(gè)操作符都會先轉(zhuǎn)換操作數(shù),然后再比較它們的相等性:
- 如果有一個(gè)操作數(shù)是布爾值,則在比較相等性之前先將其轉(zhuǎn)換為數(shù)值
- 如果是字符串和數(shù)值,先將字符串轉(zhuǎn)換為數(shù)值
- 如果一個(gè)操作數(shù)是對象,另一個(gè)不是,則調(diào)用
valueOf()方法按前面規(guī)則比較
另外:
-
null和undefined是相等的 - 要比較相等性之前,不能將
null和undefined轉(zhuǎn)換成其他值 -
NaN和誰都不相等,包括自己 - 如果兩個(gè)操作數(shù)都是對象,則判斷它們是否指向同一個(gè)對象
2.全等(===)和不全等(!==)
全等在比較之前不轉(zhuǎn)換操作數(shù)
var res1 = ("55" == 55); // true
var res2 = ("55" === 55); // false
條件操作符
看例子
var max = (num1 > num2) ? num1 : num2;
賦值操作符
有一些簡寫方法
var num = 10;
num += 10;
同理可以有
*=/=%=-=<<=>>=
小結(jié)
到這里操作符部分就結(jié)束了,東西非常多不適合硬記,在以后使用過程中慢慢體會加深印象