說 JavaScript
首頁
購買書籍
(廣告,請勿封鎖。)
目錄
讚譽
說 JavaScript
前言
您需要了解本書的內容
閱讀本書的提示
本書的四個部分
JavaScript 命令列
符號慣例
描述語法
參照方法
命令列互動
提示、註解和警告
快速尋找文件
Safari® Books Online
如何聯絡我們
致謝
準備 JavaScript
JavaScript 說明
審閱者
I. JavaScript 快速入門
1. 基本 JavaScript
背景
JavaScript 與 ECMAScript
語言的影響和性質
語法
語法的概觀
陳述式與表達式
分號
註解
變數和賦值
賦值
複合賦值運算子
識別碼和變數名稱
值
原始值與物件
原始值
物件
undefined 和 null
使用 typeof 和 instanceof 分類值
布林值
真值和假值
二元邏輯運算子
等值運算子
數字
運算子
字串
字串運算子
字串方法
陳述式
條件式
迴圈
函式
函式宣告會提升
特殊變數 arguments
參數太多或太少
選用參數
強制執行元數
將參數轉換為陣列
例外處理
嚴格模式
變數範圍和閉包
變數是函式範圍
變數會提升
閉包
IIFE 模式:引入新的範圍
物件和建構函式
單一物件
任意屬性鍵
擷取方法
方法內部的函式
建構函式:物件的工廠
陣列
陣列文字
陣列方法
反覆陣列
正規表示式
方法 test():是否有符合項?
方法 exec():符合項和擷取群組
方法 replace():搜尋和取代
數學
標準函式庫的其他功能
二、背景
2. 為什麼是 JavaScript?
JavaScript 是否免費提供?
JavaScript 是否優雅?
JavaScript 是否有用?
圖形使用者介面
其他補充 JavaScript 的技術
JavaScript 是否有好的工具?
JavaScript 是否夠快?
JavaScript 是否廣泛使用?
JavaScript 是否有未來?
結論
3. JavaScript 的本質
怪癖和非正統功能
優雅的部分
影響
4. JavaScript 如何建立
5. 標準化:ECMAScript
6. JavaScript 歷史里程碑
三、深入探討 JavaScript
7. JavaScript 的語法
語法的概觀
註解
表達式與陳述式
表達式
陳述式
控制流程陳述式和區塊
使用分號的規則
陳述式以區塊結尾後不加分號
空陳述式
自動插入分號
合法的識別碼
呼叫數字文字上的方法
嚴格模式
切換到嚴格模式
嚴格模式:建議使用,但有警告
變數必須在嚴格模式中宣告
嚴格模式中的函式
在嚴格模式中設定和刪除不可變的屬性會失敗並產生例外
未限定的識別碼無法在嚴格模式中刪除
eval() 在嚴格模式中較為乾淨
在嚴格模式中禁止的功能
8. 值
JavaScript 的類型系統
JavaScript 的類型
靜態與動態
靜態型別與動態型別
靜態類型檢查與動態類型檢查
強制轉換
原始值與物件
原始值
物件
undefined 和 null
undefined 和 null 的發生
檢查 undefined 或 null
undefined 和 null 的歷史
變更 undefined
基本資料類型的包裝物件
包裝物件與基本資料類型不同
包裝和解開包裝基本資料類型
基本資料類型從包裝物件中借用其方法
類型強制轉換
類型強制轉換可能會隱藏錯誤
轉換為布林值、數字、字串和物件的函式
演算法:ToPrimitive()—將值轉換為基本資料類型
9. 運算子
運算子和物件
賦值運算子
複合賦值運算子
相等運算子:=== 與 ==
嚴格相等(===、!==)
一般(寬鬆)相等(==、!=)
== 沒有有效的用例
排序運算子
演算法
加號運算子 (+)
演算法
布林值和數字的運算子
特殊運算子
條件運算子 ( ? : )
逗號運算子
void 運算子
透過 typeof 和 instanceof 分類值
typeof:分類基本型別
instanceof:檢查物件是否為指定建構函式的執行個體
物件運算子
10. 布林值
轉換為布林值
手動轉換為布林值
真值和假值
邏輯運算子
二元邏輯運算子:And (&&) 和 Or (||)
邏輯 And (&&)
邏輯 Or (||)
邏輯 Not (!)
相等運算子、排序運算子
布林值函式
11. 數字
數字文字
指數
呼叫文字上的方法
轉換為數字
手動轉換為數字
parseFloat()
特殊數字值
NaN
Infinity
兩個零
數字的內部表示法
特殊指數
處理捨入誤差
JavaScript 中的整數
整數範圍
將整數表示為浮點數
安全整數
轉換為整數
透過 Math.floor()、Math.ceil() 和 Math.round() 進行整數轉換
透過自訂函式 ToInteger() 進行整數轉換
透過位元運算子進行 32 位元整數轉換
透過 parseInt() 進行整數轉換
算術運算子
位元運算子
背景知識
位元 Not 運算子
二元位元運算子
位元位移運算子
數字函式
數字建構函式屬性
數字原型方法
Number.prototype.toFixed(fractionDigits?)
Number.prototype.toPrecision(precision?)
Number.prototype.toString(radix?)
Number.prototype.toExponential(fractionDigits?)
數字函式
本章節來源
12. 字串
字串文字
字串文字中的跳脫字元
字元存取
轉換為字串
手動轉換為字串
比較字串
串接字串
串接:加號 (+) 運算子
串接:合併字串片段陣列
字串函式
字串建構函式方法
字串執行個體屬性 length
字串原型方法
擷取子字串
轉換
搜尋和比較
使用正規表示式進行測試、比對和替換
13. 陳述式
宣告和指定變數
迴圈和條件式的主體
迴圈
與迴圈一起使用的機制
while
do-while
for
for-in
for each-in
條件式
if-then-else
switch
with 陳述式
語法和語意
with 陳述式已棄用
棄用的理由
debugger 陳述式
14. 例外處理
什麼是例外處理?
JavaScript 中的例外處理
throw
try-catch-finally
範例
錯誤建構函式
堆疊追蹤
實作您自己的錯誤建構函式
15. 函式
JavaScript 中函式的三個角色
術語:「參數」與「引數」
定義函式
函式運算式
函式宣告
函式建構函式
提升
函式的名稱
哪個比較好:函式宣告或函式運算式?
更進階控制函式呼叫:call()、apply() 和 bind()
func.apply(thisValue, argArray)
func.bind(thisValue, arg1, ..., argN)
處理遺失或額外的參數
所有參數依索引:特殊變數 arguments
強制執行最小參數個數的強制參數
選用參數
模擬傳遞參照參數
陷阱:意外的選用參數
命名參數
命名參數作為描述
選用命名參數
在 JavaScript 中模擬命名參數
16. 變數:範圍、環境和閉包
宣告變數
背景:靜態與動態
背景:變數的範圍
變數是函式範圍
變數宣告會提升
透過 IIFE 介紹新的範圍
IIFE 變異:前置運算子
IIFE 變異:已在運算式內容中
IIFE 變異:帶有參數的 IIFE
IIFE 應用
全域變數
最佳實務:避免建立全域變數
模組系統導致較少的全域變數
全域物件
跨平台考量
window 的使用案例
環境:管理變數
封閉:函式與其誕生範圍保持連線
透過環境處理封閉
陷阱:無意間共用環境
17. 物件與繼承
第 1 層:單一物件
屬性的種類
物件文字
點運算子 (. ):透過固定鍵存取屬性
不尋常的屬性鍵
方括弧運算子 ([] ):透過運算鍵存取屬性
將任何值轉換為物件
this 作為函式與方法的隱含參數
設定 this 時呼叫函式:call()、apply() 和 bind()
apply() 用於建構函式
陷阱:萃取方法時遺失 this
陷阱:方法中的函式會遮蔽 this
第 2 層:物件之間的原型關係
繼承
覆寫
透過原型在物件之間共用資料
取得與設定原型
特殊屬性 __proto__
設定與刪除只會影響自有屬性
屬性的反覆運算與偵測
列出自有屬性鍵
列出所有屬性鍵
檢查屬性是否存在
範例
最佳實務:反覆運算自有屬性
存取器(取得器與設定器)
透過物件文字定義存取器
透過屬性描述符定義存取器
存取器與繼承
屬性屬性和屬性描述符
屬性屬性
屬性描述符
透過描述符取得與定義屬性
複製物件
屬性:定義與指定
無法指定繼承的唯讀屬性
可列舉性:最佳實務
保護物件
防止擴充
密封
凍結
陷阱:保護是淺層的
第 3 層:建構函式—實例工廠
JavaScript 中實作的新運算子
術語:兩個原型
實例的建構函式屬性
instanceof 運算子
實作建構函式的提示
原型屬性中的資料
避免使用具有實例屬性初始值的原型屬性
避免非多態原型屬性
多態原型屬性
保持資料私密
建構函數環境中的私密資料 (Crockford 隱私模式)
帶有標記金鑰的屬性中的私密資料
帶有實體化金鑰的屬性中的私密資料
透過 IIFE 保持全域資料私密
第 4 層:建構函數之間的繼承
繼承實例屬性
繼承原型屬性
確保 instanceof 運作
覆寫方法
進行超呼叫
避免對超建構函數名稱進行硬編碼
範例:使用中的建構函數繼承
範例:內建建構函數的繼承層級
反模式:原型是超建構函數的實例
所有物件的方法
轉換為基本型別
Object.prototype.toLocaleString()
原型繼承和屬性
通用方法:從原型借用方法
透過字面量存取 Object.prototype 和 Array.prototype
呼叫通用方法的範例
類陣列物件和通用方法
所有通用方法的清單
陷阱:將物件用作映射
陷阱 1:繼承會影響讀取屬性
陷阱 2:覆寫會影響呼叫方法
陷阱 3:特殊屬性 __proto__
dict 模式:沒有原型的物件是更好的映射
最佳實務
秘笈:使用物件
18. 陣列
概觀
陣列是映射,不是元組
陣列也可以有屬性
建立陣列
Array 建構函數
多維陣列
陣列索引
in 運算子與索引
刪除陣列元素
陣列索引詳細資料
length
手動增加陣列長度
減少陣列長度
最大長度
陣列中的孔洞
建立孔洞
稀疏陣列與稠密陣列
哪些運算會忽略孔洞,哪些會考慮孔洞?
從陣列中移除孔洞
Array 建構函數方法
Array 原型方法
新增和移除元素 (具破壞性)
排序和反轉元素 (具破壞性)
比較數字
比較字串
比較物件
串接、切片、合併 (非破壞性)
搜尋值 (非破壞性)
反覆運算 (非破壞性)
檢查方法
轉換方法
簡化方法
陷阱:類陣列物件
最佳實務:迭代陣列
19. 正規表示式
正規表示式語法
原子:一般
原子:字元類別
原子:群組
量詞
斷言
析取
Unicode 和正規表示式
建立正規表示式
字面值與建構函式
旗標
正規表示式的實例屬性
建立正規表示式的範例
RegExp.prototype.test:是否有相符項目?
String.prototype.search:在什麼索引位置有相符項目?
RegExp.prototype.exec:擷取群組
第一個相符項目(未設定旗標 /g)
所有相符項目(設定旗標 /g)
String.prototype.match:擷取群組或傳回所有相符子字串
String.prototype.replace:搜尋並取代
取代項目為字串
取代項目為函式
旗標 /g 的問題
提示和技巧
引用文字
陷阱:沒有斷言(例如 ^、$),正規表示式會在任何地方找到相符項目
相符所有或沒有項目
手動實作後向觀察
正規表示式秘笈
20. 日期
日期建構函式
日期建構函式方法
日期原型方法
時間單位取得器和設定器
各種取得器和設定器
將日期轉換為字串
日期時間格式
日期格式(無時間)
時間格式(無日期)
日期時間格式
時間值:自 1970-01-01 以來的毫秒數
將日期轉換為數字
21. 數學
數學屬性
數字函式
三角函式
其他函式
22. JSON
背景
資料格式
歷史
語法
JSON.stringify(value, replacer?, space?)
JSON.stringify() 忽略的資料
toJSON() 方法
JSON.parse(text, reviver?)
透過節點訪客轉換資料
JSON.stringify()
JSON.parse()
23. 標準全域變數
建構函式
錯誤建構函式
非建構函式函式
編碼和解碼文字
分類和剖析數字
透過 eval() 和 new Function() 動態評估 JavaScript 程式碼
使用 eval() 評估程式碼
使用 new Function() 評估程式碼
eval() 與 new Function() 的比較
最佳實務
結論
主控台 API
主控台 API 在各個引擎中的標準化程度如何?
簡單記錄
檢查和計算
格式化記錄
剖析和計時
命名空間和特殊值
24. Unicode 和 JavaScript
Unicode 歷史
重要的 Unicode 概念
碼點
Unicode 編碼
JavaScript 原始碼和 Unicode
原始碼內部
原始碼外部
JavaScript 字串和 Unicode
跳脫序列
透過跳脫字元來參照星體平面字元
計算字元
Unicode 正規化
JavaScript 正規表示式和 Unicode
比對任何碼元和任何碼點
函式庫
建議閱讀和章節來源
25. ECMAScript 5 的新功能
新功能
語法變更
標準函式庫的新功能
元程式設計
新方法
JSON
與舊版瀏覽器搭配使用的秘訣
第四部分:秘訣、工具和函式庫
26. 元碼風格指南
現有的風格指南
一般秘訣
程式碼應保持一致
程式碼應易於理解
普遍接受的最佳實務
大括弧樣式
優先使用字面值而非建構函式
不要耍小聰明
可接受的聰明做法
有爭議的規則
語法
變數
物件導向
其他
結論
27. 用於除錯的語言機制
28. 建立內建類別的子類別
術語
障礙 1:具有內部屬性的執行個體
障礙 1 的解決方法
注意事項
障礙 2:無法以函式呼叫的建構函式
障礙 2 的解決方法
另一種解決方案:委派
29. JSDoc:產生 API 文件
JSDoc 的基礎
語法
命名類型
基本標籤
記錄函式和方法
內嵌類型資訊(「內嵌文件註解」)
文件化變數、參數和實例屬性
文件化類別
透過建構函式函數定義類別
透過物件文字定義類別
透過具有 @constructs 方法的物件文字定義類別
子類別化
其他有用的標籤
30. 函式庫
Shims 與 Polyfills
四種語言函式庫
ECMAScript 國際化 API
ECMAScript 國際化 API,第 1 版
這是什麼類型的標準?
我什麼時候可以使用它?
進一步閱讀
JavaScript 資源目錄
31. 模組系統和套件管理員
模組系統
套件管理員
快速且簡便的模組
32. 更多工具
33. 接下來要做的
索引
關於作者
版權頁
版權所有