閱讀總結(jié)
一本 12 年修訂(09 年初版)的過(guò)時(shí)的書(shū),很多點(diǎn)在 ES6 甚至 ES5 之后都沒(méi)有再關(guān)心的必要了。也可能是年代久遠(yuǎn)的原因,作者的很多觀點(diǎn)看上去帶有比較強(qiáng)的主觀性。總之,在今天,本書(shū)已經(jīng)帶來(lái)不了太多的收獲了。
[toc]
第 1 章 精華
- JavaScript 糟粕的比重大,但有一些非常精華的部分
- 標(biāo)準(zhǔn)委員會(huì)無(wú)法移除缺陷特性,需要開(kāi)發(fā)者自己定義精華的子集
為什么要使用 JavaScript
分析 JavaScript
- 函數(shù)式特性
- 弱類(lèi)型
- 對(duì)象字面量表示法
- 原型繼承
- 原型繼承
- 全局變量
一個(gè)簡(jiǎn)單的試驗(yàn)場(chǎng)
第 2 章 語(yǔ)法
- 介紹精華部分的語(yǔ)法,概述其語(yǔ)言結(jié)構(gòu)
- 使用鐵路圖(語(yǔ)法圖)描述語(yǔ)法
空白
標(biāo)識(shí)符
- 由一個(gè)字母開(kāi)頭,可包含字母、數(shù)字、下劃線
數(shù)字
- 只有一個(gè)數(shù)字類(lèi)型
- 64 位浮點(diǎn)數(shù)
- 沒(méi)有整數(shù)類(lèi)型
- 避免了短整型溢出等數(shù)組類(lèi)型導(dǎo)致的錯(cuò)誤
- Math
字符串
-
/轉(zhuǎn)義 - 沒(méi)有字符類(lèi)型,只需要?jiǎng)?chuàng)建一個(gè)字符串表示字符
語(yǔ)句
- 條件、循環(huán)、強(qiáng)制跳轉(zhuǎn)等語(yǔ)句
表達(dá)式
-
%是求余,而不是求模 -
()函數(shù)調(diào)用運(yùn)算符
字面量
- 對(duì)象字面量
- 數(shù)組字面量
函數(shù)
第 3 章 對(duì)象
- 可變的鍵控集合
- 屬性的容器
- 無(wú)類(lèi)型
- 原型鏈
對(duì)象字面量
var obj = { a: 1 }
檢索
.[ ]
更新
引用
原型
Object.create- 原型鏈、委托、動(dòng)態(tài)
反射
- 檢查對(duì)象屬性
hasOwnProperty
枚舉
for...in
刪除
-
delete a.b不會(huì)刪除原型鏈上的屬性
減少全局變量污染
- 作為一個(gè)全局變量的屬性
第 4 章 函數(shù)
- JavaScript 接近于完美的函數(shù)設(shè)計(jì)
函數(shù)對(duì)象
Function.prototypeFunction.prototype.constructor
函數(shù)字面量
var f = function () {}
調(diào)用
- 調(diào)用一個(gè)函數(shù)會(huì)暫停當(dāng)前函數(shù)的執(zhí)行
方法調(diào)用模式
-
this指向方法所屬的對(duì)象
函數(shù)調(diào)用模式
-
this指向全局對(duì)象
構(gòu)造器調(diào)用模式
-
this指向新對(duì)象
Apply 調(diào)用模式
-
this指向第一個(gè)參數(shù)
參數(shù)
-
arguments并不是一個(gè)好的設(shè)計(jì)
返回
-
new調(diào)用,且返回值不是對(duì)象,則返回this
異常
throw exception-
exception包含name和message屬性 -
try...catch中通過(guò)exception的name來(lái)區(qū)分錯(cuò)誤類(lèi)型
擴(kuò)充類(lèi)型的功能
Function.prototype.method
遞歸
- 自相似問(wèn)題
- 尾遞歸優(yōu)化
作用域
閉包
回調(diào)
模塊
- 使用函數(shù)和閉包來(lái)構(gòu)造模塊
級(jí)聯(lián)
- 函數(shù)鏈
柯里化
記憶
第 5 章 繼承
- 對(duì)象從其他對(duì)象繼承
偽類(lèi)
- 構(gòu)造器函數(shù)是糟糕的設(shè)計(jì)
- 隱藏了原型繼承的本質(zhì)(看上去像不完整的類(lèi)繼承)
- 沒(méi)有
new時(shí)會(huì)破壞全局環(huán)境 - 許多復(fù)雜的類(lèi)層次結(jié)構(gòu)產(chǎn)生的原因是靜態(tài)類(lèi)型檢查的約束,而 JavaScript 完全擺脫了約束,因此在代碼重用上可以有更多更好的選擇
對(duì)象說(shuō)明符
- 即
object形式的參數(shù)
原型
- 專(zhuān)注于對(duì)象,概念上更簡(jiǎn)單
函數(shù)化
- 利用閉包隱藏私有變量
部件
- 事件處理部件的 ??
第 6 章 數(shù)組
- 數(shù)組是一段線性分配的內(nèi)存,通過(guò)整數(shù)計(jì)算偏移并訪問(wèn)其中的元素,是一種性能出色的數(shù)據(jù)結(jié)構(gòu)
- 但 JavaScript 并沒(méi)有真正的數(shù)組,只有類(lèi)數(shù)組特性的對(duì)象,以字符串作為數(shù)組下標(biāo)
數(shù)組字面量
長(zhǎng)度
- 最大整數(shù)屬性名 +1
- 可以直接設(shè)置
length,設(shè)小將刪除剩余元素
刪除
-
splice,會(huì)導(dǎo)致后續(xù)的每一個(gè) key-value 變化,因此性能不高
枚舉
容易混淆的地方
- 判斷
Object和Array類(lèi)型
方法
指定初始值
第 7 章 正則表達(dá)式
- JavaScript 的正則表達(dá)式借鑒子 Perl
- JavaScript 中正則表達(dá)式相較于等效的字符串處理有顯著的性能優(yōu)勢(shì)
- 簡(jiǎn)潔但閱讀性極差,難以修改
一個(gè)例子
- 匹配 URL
- 匹配數(shù)字
結(jié)構(gòu)
- 標(biāo)識(shí)符
g, i, m(多行) -
RegExp對(duì)象,反斜杠在字符串下需要轉(zhuǎn)義,通常需要雙寫(xiě)反斜杠
元素
正則表達(dá)式分支
|
正則表達(dá)式序列
- 一個(gè)序列包含一個(gè)或多個(gè)正則表達(dá)式因子,每個(gè)因子可以跟隨一個(gè)量詞
正則表達(dá)式因子
- 一個(gè)因子可以是一個(gè)字符、一個(gè)由圓括號(hào)包圍的組、一個(gè)字符類(lèi)、一個(gè)轉(zhuǎn)義序列
正則表達(dá)式轉(zhuǎn)義
-
\1是指向分組 1 所捕獲到的文本的一個(gè)引用,所有能被再次匹配,可以用來(lái)搜索重復(fù)的單詞
正則表達(dá)式分組
- 捕獲型
- 非捕獲型
- 向前正向匹配(不好的特性)
- 向前負(fù)向匹配(不好的特性)
正則表達(dá)式字符集
- 匹配 ASCII 字符的 ??
正則表達(dá)式字符轉(zhuǎn)義
- 需要被轉(zhuǎn)義的
-/[\]^
正則表達(dá)式量詞
- 使用貪婪性匹配
第 8 章 方法
幾個(gè)不熟悉但實(shí)用的
String.prototype.lastIndexOfArray.prototype.lastIndexOfString.protoype.searchString.fromCharCode
第 9 章 代碼風(fēng)格
第 10 章 優(yōu)美的特性
- 精簡(jiǎn)的 JavaScript
- 函數(shù)是頂級(jí)對(duì)象
- 基于原型繼承的動(dòng)態(tài)對(duì)象
- 對(duì)象字面量和數(shù)組字面量
- 特性成本
附錄 A 毒瘤
- 一些難以避免的問(wèn)題特性
全局變量
作用域
自動(dòng)插入分號(hào)
保留字
Unicode
typeof
parseInt
- 遇到非數(shù)字會(huì)停止解析而不拋錯(cuò)誤
- 0 開(kāi)頭的字符串會(huì)被基于八進(jìn)制求值
+
浮點(diǎn)數(shù)
-
0.1 + 0.2 = 0.30000000000000004但這是遵循二進(jìn)制浮點(diǎn)數(shù)算數(shù)標(biāo)準(zhǔn)的
NaN
-
NaN === NaNfalse
偽數(shù)組
假值
-
null == undefinedtrue
hasOwnProperty
- 是方法而不是以運(yùn)算符
對(duì)象
附錄 B 糟粕
- 可以避免的問(wèn)題特性
==
with
eval
- 同樣的還有 Function 構(gòu)造器、接受字符串參數(shù)時(shí)的 setTimeout/setInterval
continue 語(yǔ)句
- 性能不好
switch 穿越
缺少塊的語(yǔ)句
++ --
- 鼓勵(lì)了一種不夠謹(jǐn)慎的編程風(fēng)格
位運(yùn)算符
- JavaScript 的執(zhí)行環(huán)境接觸不到硬件,因此位運(yùn)算性能差
function 語(yǔ)句對(duì)比 function 表達(dá)式
類(lèi)型的包裝對(duì)象
- 避免使用
new Object等
new
void
附錄 C - E 跳過(guò)