《javaScript高級程序設(shè)計(jì)》讀書筆記(三)

以下內(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
  • 如果是InfinityInfinity,則結(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
  • 如果是InfinityInfinity,則結(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ī)則比較

另外:

  • nullundefined是相等的
  • 要比較相等性之前,不能將nullundefined轉(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é)束了,東西非常多不適合硬記,在以后使用過程中慢慢體會加深印象

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容