寫在前面
我曾經輔導過很多人編程,其中有學霸也有學渣,而編程這個事情,學霸經常會陷入一個 誤區:所有的語法都要記住,所有的特性都要瞭如指掌纔算精通。而我們所面對的筆試甚至一些面試也加深了這種印象,事實真的如此麼?
對於枯燥的語法知識,我們要知其然,知其所以然,但是不需要死記硬背,我們的大腦善於記住感性的東西,所謂:一朝被蛇咬就是如此,我們講的一些不常用的特性,大家只需要在大腦中形成這裏有坑的印象,用的時候回來再看就是了,記住:書是用來查的,教程也是。
自增自減
自增自減的邏輯與c一致,這裏不過多敘述,我們只關注一下不同類型的數據自增自減的情況,這裏放一個例子以供查詢就好:
位操作
js中位操作與c中一致,新增了一個無符號的右移,這裏我們複習一下即可
- 按位非 ~
- 按位與 &
- 按位或 |
- 按位異或 ^
- 左移 << 注意,左移不影響符號位,不會影響數字的正負
- 有符號右移 >> 這個右移不會影響符號
- 無符號右移 >>> 這個右移因爲標誌位一起填0導致負數變正數且因爲負數中1很多,導致出來的數字很大
邏輯運算符
與c中一致,需要注意的是與常用於短路操作,或常用於備用值的賦值,複習一下:
- 與 && 常用於短路操作
- 或 || 常用於備用值 a = b || c 表示如果b是null則把c賦值給a
- 非 !
注意,&&如果兩邊不是布爾值,會按照下面的邏輯運行:
|| 如果兩邊不是布爾值,按照下面的邏輯
乘除操作符
在乘除操作符中,我們需要考慮一下無窮大和NaN的介入,我們記錄一下一些特殊的乘除操作結果
- 乘法 *
- 除法 /
- 餘數 %
加減運算符
加減運算符同樣需要考慮無窮大和NaN的介入
- 加 需要注意的是,加號兩邊只要有一邊是字符串,這個結果將會是字符串連接
- 減法
關係運算符
關係運算符包括:大於 小於 大於等於 小於等於,在使用這些關係運算符的時候也需要注意相應的特殊類型的取值
這裏我們重點關注一下字符串的比較大小,由於是比較編碼值,所以要注意下面幾個場景
- “Ba” < “aL” 由於大寫字母的編碼都小於小寫字母,所以如果想實現字符串的比較,需要先都轉化爲大寫或者小寫比較 “BL”.toLowerCase()
- “23” < “3” 因爲比較的時候會先比較第一位,第一位有大小之後後面的就不會比較了
- “23” < 3 返回false,因爲字符串會先轉化爲數值進行比較
- “a” < 3 false,因爲"a"會轉爲NaN
- NaN和任何比較,不管大於還是小於都返回false
相等和全等(重要)
- 相等:比較對象轉化爲相近的對象進行比較
- 全等:不轉換光比較
相等的比較遵循下面的原則:
- 布爾值 true是1 false是0 轉化爲數值進行比較
- 一個字符串一個數值比較,把字符串轉爲數值
- 對象和別人比較,調用valueOf之後比較
下面的表整理了相等的一些特殊情況,主要是undefined null NaN,我們需要注意的是
- null == undefined
- NaN跟誰都不等,包括自己
- 對象指向一致則相等
全等則是先比較類型,再比較值,如果兩個類型不同,則直接false
"55" == 55 // true
"55" === 55 // false
需要注意的是,undefined 相等於 null,但是 undefined 不全等於 null
undefined == null // true
undefined === null // false
注意:js中推薦使用全等以避免可能帶來的類型轉化問題。
冒號表達式
這個就是普通的冒號表達式
var a = (b > c) ? d : e; // 表達式爲true返回d 表達式爲false返回e
賦值操作
= 爲賦值操作符,js支持 += *= 等,但是用這些簡化的賦值操作符不會帶來任何的性能提升。