《JavaScript高級程序設計(第3版)》是JavaScript超級暢銷書的版。ECMAScript 5和HTML5在標準之爭中雙雙勝出,使大量專有實現和客戶端擴展正式進入規范,同時也為JavaScript增添了很多適應未來發展的新特性。《JavaScript高級程序設計》這一版除增加5章全新內容外,其他章節也有較大幅度的增補和修訂,新內容篇幅約占三分之一。全書從JavaScript語言實現的各個組成部分——語言核心、DOM、BOM、事件模型講起,深入淺出地探討了面向對象編程、Ajax與Comet服務器端通信,HTML5表單、媒體、Canvas(包括WebGL)及Web Workers、地理定位、跨文檔傳遞消息、客戶端存儲(包括IndexedDB)等新API,還介紹了離線應用和與維護、性能、部署相關的開發實踐。《JavaScript高級程序設計(第3版)》附錄展望了未來的API和ECMAScript Harmony規范。
《JavaScript高級程序設計(第3版)》適合有一定編程經驗的Web應用開發人員閱讀,也可作為高校及社會實用技術培訓相關專業課程的教材。
1995年,Brendan Eich創造了JavaScript。
2005年,席卷全球的“Ajax熱”激發了全世界Web開發人員學習JavaScript的熱情。與此同時,本書第1版誕生。這一版的中文版狂銷4萬冊,被譽為“深度的JavaScript經典”,奠定了其不可替代的地位。2005年到2009年,前端開發社區在實踐中充分檢驗了這門語言的各種實現和擴展,JavaScript從被戲謔的“玩具語言”一躍成為軟件業舉足輕重的通用編程語言。2009年1月本書第2版應運而生,凝聚作者和社區專家多年寶貴經驗的這一技術名著再次得到讀者認可和褒揚,中文版銷量達到2萬冊。2009年到2011年,ECMAScript5和HTML5在標準之爭中雙雙勝出,使大量專有實現和客戶端擴展正式進入規范,同時也為這門語言增添了很多適應未來發展的新特性。2012年初本書第3版面世,中文版也緊隨其后。第3版除增加5章全新內容外,其他章節也有較大幅度的增補和修訂,新內容篇幅約占三分之一。
作為JavaScript技術經典名著,《JavaScript高級程序設計(第3版)》承繼了之前版本深入、貼近實戰的特點,在詳細講解了JavaScript語言的核心之后,條分縷析地為讀者展示了現有規范及實現為開發Web應用提供的各種支持和特性。
Nicholas C. Zakas(尼古拉斯?澤卡斯)世界Web技術專家,現為雅虎公司界面呈現架構師,負責My Yahoo!和雅虎首頁等大訪問量站點的設計。尼古拉斯擁有豐富的Web開發和界面設計經驗,曾經參與許多大公司的Web解決方案開發。他還是High Performance JavaScript一書的作者,并與他人合作撰寫了Professional Ajax和Even Faster Web Sites。尼古拉斯擁有梅里馬克學院計算機科學學士學位和埃迪柯特學院的MBA學位。他的個人網站是www.nczonline.net,他的Twitter別名是@slicknet。
目 錄
第1章 JavaScript簡介 1
1.1 JavaScript簡史 1
1.2 JavaScript實現 2
1.2.1 ECMAScript 3
1.2.2 文檔對象模型(DOM) 5
1.2.3 瀏覽器對象模型(BOM) 8
1.3 JavaScript版本 8
1.4 小結 9
第2章 在HTML中使用JavaScript 10
2.1 元素 10
2.1.1 標簽的位置 12
2.1.2 延遲腳本 13
2.1.3 異步腳本 13
2.1.4 在XHTML中的用法 14
2.1.5 不推薦使用的語法 16
2.2 嵌入代碼與外部文件 16
2.3 文檔模式 16
2.4 元素 18
2.5 小結 18
第3章 基本概念 19
3.1 語法 19
3.1.1 區分大小寫 19
3.1.2 標識符 19
3.1.3 注釋 20
3.1.4 嚴格模式 20
3.1.5 語句 20
3.2 關鍵字和保留字 21
3.3 變量 22
3.4 數據類型 23
3.4.1 typeof操作符 23
3.4.2 Undefined類型 24
3.4.3 Null類型 25
3.4.4 Boolean類型 26
3.4.5 Number類型 27
3.4.6 String類型 32
3.4.7 Object類型 35
3.5 操作符 36
3.5.1 一元操作符 36
3.5.2 位操作符 39
3.5.3 布爾操作符 44
3.5.4 乘性操作符 47
3.5.5 加性操作符 48
3.5.6 關系操作符 50
3.5.7 相等操作符 51
3.5.8 條件操作符 53
3.5.9 賦值操作符 53
3.5.10 逗號操作符 54
3.6 語句 54
3.6.1 if語句 54
3.6.2 do-while語句 55
3.6.3 while語句 55
3.6.4 for語句 56
3.6.5 for-in語句 57
3.6.6 label語句 58
3.6.7 break和continue語句 58
3.6.8 with語句 60
3.6.9 switch語句 60
3.7 函數 62
3.7.1 理解參數 64
3.7.2 沒有重載 66
3.8 小結 67
第4章 變量、作用域和內存問題 68
4.1 基本類型和引用類型的值 68
4.1.1 動態的屬性 68
4.1.2 復制變量值 69
4.1.3 傳遞參數 70
4.1.4 檢測類型 72
4.2 執行環境及作用域 73
4.2.1 延長作用域鏈 75
4.2.2 沒有塊級作用域 76
4.3 垃圾收集 78
4.3.1 標記清除 78
4.3.2 引用計數 79
4.3.3 性能問題 80
4.3.4 管理內存 81
4.4 小結 81
第5章 引用類型 83
5.1 Object類型 83
5.2 Array類型 86
5.2.1 檢測數組 88
5.2.2 轉換方法 89
5.2.3 棧方法 90
5.2.4 隊列方法 91
5.2.5 重排序方法 92
5.2.6 操作方法 94
5.2.7 位置方法 95
5.2.8 迭代方法 96
5.2.9 縮小方法 97
5.3 Date類型 98
5.3.1 繼承的方法 100
5.3.2 日期格式化方法 101
5.3.3 日期/時間組件方法 102
5.4 RegExp類型 103
5.4.1 RegExp實例屬性 105
5.4.2 RegExp實例方法 106
5.4.3 RegExp構造函數屬性 107
5.4.4 模式的局限性 109
5.5 Function類型 110
5.5.1 沒有重載(深入理解) 111
5.5.2 函數聲明與函數表達式 111
5.5.3 作為值的函數 112
5.5.4 函數內部屬性 113
5.5.5 函數屬性和方法 116
5.6 基本包裝類型 118
5.6.1 Boolean類型 120
5.6.2 Number類型 120
5.6.3 String類型 122
5.7 單體內置對象 130
5.7.1 Global對象 131
5.7.2 Math對象 134
5.8 小結 137
第6章 面向對象的程序設計 138
6.1 理解對象 138
6.1.1 屬性類型 139
6.1.2 定義多個屬性 142
6.1.3 讀取屬性的特性 143
6.2 創建對象 144
6.2.1 工廠模式 144
6.2.2 構造函數模式 144
6.2.3 原型模式 147
6.2.4 組合使用構造函數模式和原型模式 159
6.2.5 動態原型模式 159
6.2.6 寄生構造函數模式 160
6.2.7 穩妥構造函數模式 161
6.3 繼承 162
6.3.1 原型鏈 162
6.3.2 借用構造函數 167
6.3.3 組合繼承 168
6.3.4 原型式繼承 169
6.3.5 寄生式繼承 171
6.3.6 寄生組合式繼承 172
6.4 小結 174
第7章 函數表達式 175
7.1 遞歸 177
7.2 閉包 178
7.2.1 閉包與變量 181
7.2.2 關于this對象 182
7.2.3 內存泄漏 183
7.3 模仿塊級作用域 184
7.4 私有變量 186
7.4.1 靜態私有變量 188
7.4.2 模塊模式 189
7.4.3 增強的模塊模式 191
7.5 小結 192
第8章 BOM 193
8.1 window對象 193
8.1.1 全局作用域 193
8.1.2 窗口關系及框架 194
8.1.3 窗口位置 197
8.1.4 窗口大小 198
8.1.5 導航和打開窗口 199
8.1.6 間歇調用和超時調用 203
8.1.7 系統對話框 205
8.2 location對象 207
8.2.1 查詢字符串參數 207
8.2.2 位置操作 208
8.3 navigator對象 210
8.3.1 檢測插件 211
8.3.2 注冊處理程序 213
8.4 screen對象 214
8.5 history對象 215
8.6 小結 216
第9章 客戶端檢測 217
9.1 能力檢測 217
9.1.1 更的能力檢測 218
9.1.2 能力檢測,不是瀏覽器檢測 220
9.2 怪癖檢測 220
9.3 用戶檢測 221
9.3.1 用戶字符串的歷史 222
9.3.2 用戶字符串檢測技術 228
9.3.3 完整的代碼 242
9.3.4 使用方法 245
9.4 小結 246
第10章 DOM 247
10.1 節點層次 247
10.1.1 Node類型 248
10.1.2 Document類型 253
10.1.3 Element類型 261
10.1.4 Text類型 270
10.1.5 Comment類型 273
10.1.6 CDATASection類型 274
10.1.7 DocumentType類型 274
10.1.8 DocumentFragment類型 275
10.1.9 Attr類型 276
10.2 DOM操作技術 277
10.2.1 動態腳本 277
10.2.2 動態樣式 279
10.2.3 操作表格 281
10.2.4 使用NodeList 283
10.3 小結 284
第11章 DOM擴展 286
11.1 選擇符API 286
11.1.1 querySelector()方法 286
11.1.2 querySelectorAll()方法 287
11.1.3 matchesSelector()方法 288
11.2 元素遍歷 288
11.3 HTML5 289
11.3.1 與類相關的擴充 289
11.3.2 焦點管理 291
11.3.3 HTMLDocument的變化 292
11.3.4 字符集屬性 293
11.3.5 自定義數據屬性 293
11.3.6 插入標記 294
11.3.7 scrollIntoView()方法 298
11.4 專有擴展 298
11.4.1 文檔模式 298
11.4.2 children屬性 299
11.4.3 contains()方法 300
11.4.4 插入文本 301
11.4.5 滾動 303
11.5 小結 304
第12章 DOM2和DOM3 305
12.1 DOM變化 305
12.1.1 針對XML命名空間的變化 306
12.1.2 其他方面的變化 309
12.2 樣式 312
12.2.1 訪問元素的樣式 313
12.2.2 操作樣式表 317
12.2.3 元素大小 320
12.3 遍歷 326
12.3.1 NodeIterator 328
12.3.2 TreeWalker 330
12.4 范圍 332
12.4.1 DOM中的范圍 332
12.4.2 IE8及更早版本中的范圍 340
12.5 小結 343
第13章 事件 345
13.1 事件流 345
13.1.1 事件冒泡 346
13.1.2 事件捕獲 346
13.1.3 DOM事件流 347
13.2 事件處理程序 348
13.2.1 HTML事件處理程序 348
13.2.2 DOM0級事件處理程序 350
13.2.3 DOM2級事件處理程序 351
13.2.4 IE事件處理程序 352
13.2.5 跨瀏覽器的事件處理程序 353
13.3 事件對象 355
13.3.1 DOM中的事件對象 355
13.3.2 IE中的事件對象 358
13.3.3 跨瀏覽器的事件對象 360
13.4 事件類型 362
13.4.1 UI事件 362
13.4.2 焦點事件 367
13.4.3 鼠標與滾輪事件 368
13.4.4 鍵盤與文本事件 379
13.4.5 復合事件 384
13.4.6 變動事件 385
13.4.7 HTML5事件 388
13.4.8 設備事件 395
13.4.9 觸摸與手勢事件 399
13.5 內存和性能 402
13.5.1 事件委托 402
13.5.2 移除事件處理程序 404
13.6 模擬事件 405
13.6.1 DOM中的事件模擬 405
13.6.2 IE中的事件模擬 410
13.7 小結 411
第14章 表單腳本 412
14.1 表單的基礎知識 412
14.1.1 提交表單 413
14.1.2 重置表單 414
14.1.3 表單字段 414
14.2 文本框腳本 419
14.2.1 選擇文本 420
14.2.2 過濾輸入 423
14.2.3 自動切換焦點 426
14.2.4 HTML5約束驗證API 427
14.3 選擇框腳本 431
14.3.1 選擇選項 432
14.3.2 添加選項 434
14.3.3 移除選項 435
14.3.4 移動和重排選項 435
14.4 表單序列化 436
14.5 富文本編輯 438
14.5.1 使用contenteditable屬性 438
14.5.2 操作富文本 439
14.5.3 富文本選區 441
14.5.4 表單與富文本 443
14.6 小結 443
第15章 使用Canvas繪圖 445
15.1 基本用法 445
15.2 2D上下文 446
15.2.1 填充和描邊 446
15.2.2 繪制矩形 447
15.2.3 繪制路徑 449
15.2.4 繪制文本 451
15.2.5 變換 453
15.2.6 繪制圖像 456
15.2.7 陰影 457
15.2.8 漸變 458
15.2.9 模式 460
15.2.10 使用圖像數據 460
15.2.11 合成 462
15.3 WebGL 463
15.3.1 類型化數組 463
15.3.2 WebGL上下文 468
15.3.3 支持 478
15.4 小結 478
第16章 HTML5腳本編程 480
16.1 跨文檔消息傳遞 480
16.2 原生拖放 481
16.2.1 拖放事件 482
16.2.2 自定義放置目標 482
16.2.3 dataTransfer對象 483
16.2.4 dropEffect與effectAllowed 484
16.2.5 可拖動 485
16.2.6 其他成員 485
16.3 媒體元素 486
16.3.1 屬性 487
16.3.2 事件 488
16.3.3 自定義媒體播放器 488
16.3.4 檢測編解碼器的支持情況 489
16.3.5 Audio類型 490
16.4 歷史狀態管理 491
16.5 小結 492
第17章 錯誤處理與調試 493
17.1 瀏覽器報告的錯誤 493
17.1.1 IE 493
17.1.2 Firefox 494
17.1.3 Safari 496
17.1.4 Opera 497
17.1.5 Chrome 498
17.2 錯誤處理 499
17.2.1 try-catch語句 500
17.2.2 拋出錯誤 503
17.2.3 錯誤(error)事件 505
17.2.4 處理錯誤的策略 506
17.2.5 常見的錯誤類型 507
17.2.6 區分致命錯誤和非致命錯誤 510
17.2.7 把錯誤記錄到服務器 511
17.3 調試技術 512
17.3.1 將消息記錄到控制臺 512
17.3.2 將消息記錄到當前頁面 515
17.3.3 拋出錯誤 515
17.4 常見的IE錯誤 516
17.4.1 操作終止 516
17.4.2 無效字符 518
17.4.3 未找到成員 518
17.4.4 未知運行時錯誤 519
17.4.5 語法錯誤 519
17.4.6 系統無法找到指定資源 519
17.5 小結 520
第18章 JavaScript與XML 521
18.1 瀏覽器對XMLDOM的支持 521
18.1.1 DOM2級核心 521
18.1.2 DOMParser類型 522
18.1.3 XMLSerializer類型 523
18.1.4 IE8及之前版本中的XML 523
18.1.5 跨瀏覽器處理XML 527
18.2 瀏覽器對XPath的支持 529
18.2.1 DOM3級XPath 529
18.2.2 IE中的XPath 534
18.2.3 跨瀏覽器使用XPath 535
18.3 瀏覽器對XSLT的支持 537
18.3.1 IE中的XSLT 537
18.3.2 XSLTProcessor類型 541
18.3.3 跨瀏覽器使用XSLT 543
18.4 小結 544
第19章 E4X 546
19.1 E4X的類型 546
19.1.1 XML類型 546
19.1.2 XMLList類型 547
19.1.3 Namespace類型 548
19.1.4 QName類型 549
19.2 一般用法 550
19.2.1 訪問特性 551
19.2.2 其他節點類型 552
19.2.3 查詢 553
19.2.4 構建和操作XML 555
19.2.5 解析和序列化 557
19.2.6 命名空間 558
19.3 其他變化 559
19.4 啟用E4X 560
19.5 小結 561
第20章 JSON 562
20.1 語法 562
20.1.1 簡單值 562
20.1.2 對象 563
20.1.3 數組 564
20.2 解析與序列化 565
20.2.1 JSON對象 565
20.2.2 序列化選項 566
20.2.3 解析選項 569
20.3 小結 570
第21章 Ajax與Comet 571
21.1 XMLHttpRequest對象 571
21.1.1 XHR的用法 573
21.1.2 HTTP頭部信息 575
21.1.3 GET請求 576
21.1.4 POST請求 577
21.2 XMLHttpRequest2級 578
21.2.1 FormData 578
21.2.2 超時設定 579
21.2.3 overrideMimeType()方法 580
21.3 進度事件 580
21.3.1 load事件 580
21.3.2 progress事件 581
21.4 跨源資源共享 582
21.4.1 IE對CORS的實現 582
21.4.2 其他瀏覽器對CORS的實現 584
21.4.3 PreflightedReqeusts 584
21.4.4 帶憑據的請求 585
21.4.5 跨瀏覽器的CORS 585
21.5 其他跨域技術 586
21.5.1 圖像Ping 586
21.5.2 JSONP 587
21.5.3 Comet 588
21.5.4 服務器發送事件 590
21.5.5 WebSockets 591
21.5.6 SS
JavaScript簡介
本章內容
JavaScript歷史回顧
JavaScript是什么
JavaScript與ECMAScript的關系
JavaScript的不同版本
avaScript誕生于1995年。當時,它的主要目的是處理以前由服務器端語言(如Perl)負責的一些輸入驗證操作。在JavaScript問世之前,必須把表單數據發送到服務器端才能確定用戶是否沒有填寫某個必填域,是否輸入了無效的值。Netscape Navigator希望通過JavaScript來解決這個問題。在人們普遍使用電話拔號上網的年代,能夠在客戶端完成一些基本的驗證任務是令人興奮的。畢竟,撥號上網的速度之慢,導致了與服務器的每一次數據交換事實上都成了對人們耐心的一次考驗。
自此以后,JavaScript逐漸成為市面上常見瀏覽器必備的一項特色功能。如今,JavaScript的用途早已不再局限于簡單的數據驗證,而是具備了與瀏覽器窗口及其內容等幾乎所有方面交互的能力。今天的JavaScript已經成為一門功能的編程語言,能夠處理復雜的計算和交互,擁有了閉包、匿名(lamda,拉姆達)函數,甚至元編程等特性。作為Web的一個重要組成部分,JavaScript的重要性是不言而喻的,就連手機瀏覽器,甚至那些專為殘障人士設計的瀏覽器等非常規瀏覽器都支持它。當然,微軟的例子更為典型。雖然有自己的客戶端腳本語言VBScript,但微軟仍然在Internet Explorer的早期版本中加入了自己的JavaScript實現 。
JavaScript從一個簡單的輸入驗證器發展成為一門強大的編程語言,出乎人們的意料。應該說,它既是一門非常簡單的語言,又是一門非常復雜的語言。說它簡單,是因為學會使用它只需片刻功夫;而說它復雜,是因為要真正掌握它則需要數年時間。要想理解和掌握JavaScript,關鍵在于弄清楚它的本質、歷史和局限性。
1.1 JavaScript簡史
在Web日益流行的同時,人們對客戶端腳本語言的需求也越來越強烈。那個時候,絕大多數因特網用戶都使用速度僅為28.8kbit/s的“貓”(調制解調器)上網,但網頁的大小和復雜性卻不斷增加。為完成簡單的表單驗證而頻繁地與服務器交換數據只會加重用戶的負擔。想象一下:用戶填寫完一個表單,單擊“提交”按鈕,然后等待30秒鐘,最終服務器返回消息說有一個必填字段沒有填好……當時走在技術革新最前沿的Netscape公司,決定著手開發一種客戶端語言,用來處理這種簡單的驗證。
當時就職于Netscape公司的布蘭登?艾奇(Brendan Eich),開始著手為計劃于1995年2月的Netscape Navigator 2開發一種名為LiveScript的腳本語言——該語言將同時在瀏覽器和服務器中使用(它在服務器上的名字叫LiveWire)。為了趕在日期前完成LiveScript的開發,Netscape與Sun公司建立了一個開發聯盟。在Netscape Navigator 2正式前夕,Netscape為了搭上媒體熱炒Java的順風車,臨時把LiveScript改名為JavaScript。
由于JavaScript 1.0獲得了巨大成功,Netscape隨即在Netscape Navigator 3中又了JavaScript 1.1。Web雖然羽翼未豐,但用戶關注度卻屢創新高。在這樣的背景下,Netscape把自己定位為市場領袖型公司。與此同時,微軟決定向與Navigator競爭的自家產品Internet Explorer瀏覽器投入更多資源。Netscape Navigator 3后不久,微軟就在其Internet Explorer 3中加入了名為JScript的JavaScript實現(命名為JScript是為了避開與Netscape有關的授權問題)。以現在的眼光來看,微軟1996年8月為進入Web瀏覽器領域而實施的這個重大舉措,是導致Netscape日后蒙羞的一個標志性事件。然而,這個重大舉措同時也標志著JavaScript作為一門語言,其開發向前邁進了一大步。
微軟推出其JavaScript實現意味著有了3個不同的JavaScript版本:Netscape Navigator中的JavaScript、Internet Explorer中的Jscript和ScriptEase中的CEnvi。與C及其他編程語言不同,當時還沒有標準規定JavaScript的語法和特性,3個不同版本并存的局面已經暴露了這個問題。隨著業界擔心的日益加劇,JavaScript的標準化問題被提上了議事日程。
1997年,以JavaScript 1.1為藍本的建議被提交給了歐洲計算機制造商協會(Ecma,European Computer Manufacturers Association)。該協會指定39號技術委員會(TC39,Technical Committee #39)負責“標準化一種通用、跨平臺、供應商中立的腳本語言的語法和語義”(www.ecma international.org/memento/TC39.htm)。TC39由來自Netscape、Sun、微軟、Borland及其他關注腳本語言發展的公司的程序員組成,他們經過數月的努力完成了ECMA-262——定義一種名為ECMAScript(發音為“ek-ma-script”)的新腳本語言的標準。
第二年,ISO/IEC(International Organization for Standardization and International Electrotechnical Commission,國標標準化組織和國際電工委員會)也采用了ECMAScript作為標準(即ISO/IEC-16262)。自此以后,瀏覽器開發商就開始致力于將ECMAScript作為各自JavaScript實現的基礎,也在不同程度上取得了成功。
1.2 JavaScript實現
雖然JavaScript和ECMAScript通常都被人們用來表達相同的含義,但JavaScript的含義卻比ECMA-262中規定的要多得多。沒錯,一個完整的JavaScript實現應該由下列三個不同的部分組成(見圖1-1)。
核心(ECMAScript)
文檔對象模型(DOM)
瀏覽器對象模型(BOM)
1.2.1 ECMAScript
由ECMA-262定義的ECMAScript與Web瀏覽器沒有依賴關系。實際上,這門語言本身并不包含輸入和輸出定義。ECMA-262定義的只是這門語言的基礎,而在此基礎之上可以構建更完善的腳本語言。我們常見的Web瀏覽器只是ECMAScript實現可能的宿主環境之一。宿主環境不僅提供基本的ECMAScript實現,同時也會提供該語言的擴展,以便語言與環境之間對接交互。而這些擴展——如DOM,則利用ECMAScript的核心類型和語法提供更多更具體的功能,以便實現針對環境的操作。前面介紹過的Node以及眾所周知的Adobe Flash也都是宿主環境。
既然ECMA-262標準沒有參照Web瀏覽器,那它都規定了些什么內容呢?大致說來,它規定了這門語言的下列組成部分:
語法
類型
語句
關鍵字
保留字
操作符
對象
ECMAScript就是對實現該標準規定的各個方面內容的語言的描述。JavaScript實現了ECMAScript,Adobe ActionScript同樣也實現了ECMAScript。
1. ECMAScript的版本
ECMAScript的不同版本又稱為版次,以第x版表示(意即描述特定實現的ECMA-262規范的第x個版本)。ECMA-262的最近一版是第5版,于2009年。而ECMA-262的第1版本質上與Netscape的JavaScript 1.1相同——只不過刪除了所有針對瀏覽器的代碼并作了一些較小的改動:ECMA-262要求支持Unicode標準(從而支持多語言開發),而且對象也變成了平臺無關的(Netscape JavaScript 1.1的對象在不同平臺中的實現不一樣,例如Date對象)。這也是JavaScript 1.1和1.2與ECMA-262第1版不一致的主要原因。
ECMA-262第2版主要是編輯加工的結果。這一版中內容的更新是為了與ISO/IEC-16262保持嚴格一致,沒有作任何新增、修改或刪節處理。因此,一般不使用第2版來衡量ECMAScript實現的兼容性。
ECMA-262第3版才是對該標準及時次真正的修改。修改的內容涉及字符串處理、錯誤定義和數值輸出。這一版還新增了對正則表達式、新控制語句、try-catch異常處理的支持,并圍繞標準的國際化做出了一些小的修改。從各方面綜合來看,第3版標志著ECMAScript成為了一門真正的編程語言。
ECMA-262第4版對這門語言進行了一次的檢核修訂。由于JavaScript在Web上日益流行,開發人員紛紛建議修訂ECMAScript,以使其能夠滿足不斷增長的Web開發需求。作為回應,ECMA TC39重新召集相關人員共同謀劃這門語言的未來。結果,出臺后的標準幾乎在第3版基礎上定義了一門新語言。第4版不僅包含了強類型變量、新語句和新數據結構、真正的類和經典繼承,還定義了與數據交互的新方式。
與此同時,TC39下屬的一個小組也提出了一個名為ECMAScript 3.1的替代性建議,該建議只對這門語言進行了較少的改進。這個小組認為第4版給這門語言帶來的跨越太大了。因此,該小組建議對這門語言進行小幅修訂,能夠在現有JavaScript引擎基礎上實現。最終,ES3.1附屬委員會獲得的支持超過了TC39,ECMAS-262第4版在正式前被放棄。
ECMAScript 3.1成為ECMA-262第5版,并于2009年12月3日正式。第5版力求澄清第3版中已知的歧義并增添了新的功能。新功能包括原生JSON對象(用于解析和序列化JSON數據)、繼承的方法和高級屬性定義,另外還包含一種嚴格模式,對ECMAScript引擎解釋和執行代碼進行了補充說明。
2. 什么是ECMAScript兼容
ECMA-262給出了ECMAScript兼容的定義。要想成為ECMAScript的實現,則該實現必須做到:
支持ECMA-262描述的所有“類型、值、對象、屬性、函數以及程序句法和語義”(ECMA-262第1頁);
支持Unicode字符標準。
此外,兼容的實現還可以進行下列擴展。
添加ECMA-262沒有描述的“更多類型、值、對象、屬性和函數”。ECMA-262所說的這些新增特性,主要是指該標準中沒有規定的新對象和對象的新屬性。
支持ECMA-262沒有定義的“程序和正則表達式語法”。(也就是說,可以修改和擴展內置的正則表達式語法。)
上述要求為兼容實現的開發人員基于ECMAScript開發一門新語言提供了廣闊的空間和極大的靈活性,這也從另一個側面說明了ECMAScript受開發人員歡迎的原因。
3. Web瀏覽器對ECMAScript的支持
1996年,Netscape Navigator 3捆綁了JavaScript 1.1。而相同的JavaScript 1.1設計規范隨后作為對新標準(ECMA-262)的建議被提交給Ecma。伴隨著JavaScript的迅速走紅,Netscape豪情滿懷地著手開發JavaScript 1.2。然而,問題是Ecma當時還沒有接受Netscape的建議。
Netscape Navigator 3后不久,微軟也推出了Internet Explorer 3。微軟在IE的這一版中捆綁了JScript 1.0,很多人都認為JScript 1.0與JavaScript 1.1應該是一樣的。但是,由于沒有文檔依據,加之不適當的特性模仿,JScript 1.0還是很難與JavaScript 1.1相提并論。
1997年,內置JavaScript 1.2的Netscape Navigator 4;而到這一年年底,ECMA-262第1版也被接受并實現了標準化。結果,雖然ECMAScript被認為是基于JavaScript 1.1制定的,但JavaScript 1.2與ECMAScript的第1版并不兼容。
JScript的升級版是Internet Explorer 4中內置的JScript 3.0(隨同微軟IIS 3.0的JScript 2.0從來也沒有移植到瀏覽器中)。微軟通過媒體大肆宣傳JScript 3.0是世界上及時個ECMA兼容的腳本語言,但當時的ECMA-262尚未定稿。于是,JScript 3.0與JavaScript 1.2都遭遇了相同的尷尬局面——誰都沒有按照最終的ECMAScript標準來實現。
Netscape決定更新其JavaScript實現,即在Netscape Navigator 4.06中JavaScript 1.3,從而做到了與ECMA-262的及時個版本兼容。在JavaScript 1.3中,Netscape增加了對Unicode標準的支持,并在保留JavaScript 1.2新增特性的同時實現了所有對象的平臺中立化。
在Netscape以Mozilla項目的名義開放其源代碼時,預期JavaScript 1.4將隨同Netscape Navigator 5一道。然而,一個激進的決定,徹底重新設計Netscape代碼,打亂了原有計劃。后來,JavaScript 1.4只了針對Netscape Enterprise Server的服務器版,而沒有內置于Web瀏覽器中。
到了2008年,五大主流Web瀏覽器(IE、Firefox、Safari、Chrome和Opera)全部做到了與ECMA-262兼容。IE8是及時個著手實現ECMA-262第5版的瀏覽器,并在IE9中提供了完整的支持。Firefox 4也緊隨其后做到兼容。下表列出了ECMAScript受主流Web瀏覽器支持的情況。
瀏 覽 器 ECMAScript兼容性 瀏 覽 器 ECMAScript兼容性
Netscape Navigator 2 — Opera 6~7.1 第2版
Netscape Navigator 3 — Opera 7.2 第3版
Netscape Navigator 4~4.05 — Safari 1~2.0.x 第3版
Netscape Navigator 4.06~4.79 第1版 Safari 3.x 第3版
Netscape 6 (Mozilla 0.6.0 ) 第3版 Safari 4.x~5.x 第5版
IE3 — Chrome 1 第3版
IE4 — Firefox 1~2 第3版
IE5 第1版 Firefox 3.0.x 第3版
IE5.5~IE7 第3版 Firefox 3.5~3.6 第5版
IE8 第5版 Firefox 4.0 第5版
IE9 第5版
不兼容的實現
1.2.2 文檔對象模型(DOM)
文檔對象模型(DOM,Document Object Model)是針對XML但經過擴展用于HTML的應用程序編程接口(API,Application Programming Interface)。DOM把整個頁面映射為一個多層節點結構。HTML或XML頁面中的每個組成部分都是某種類型的節點,這些節點又包含著不同類型的數據。看下面這個HTML頁面:
Hello World!
在DOM中,這個頁面可以通過見圖1-2所示的分層節點圖表示。
通過DOM創建的這個表示文檔的樹形圖,開發人員獲得了控制頁面內容和結構的主動權。借助DOM提供的API,開發人員可以輕松自如地刪除、添加、替換或修改任何節點。
1. 為什么要使用DOM
在Internet Explorer 4和Netscape Navigator 4分別支持的不同形式的DHTML(Dynamic HTML)基礎上,開發人員首次無需重新加載網頁,就可以修改其外觀和內容了。然而,DHTML在給Web技術發展帶來巨大進步的同時,也帶來了巨大的問題。由于Netscape和微軟在開發DHTML方面各持己見,過去那個只編寫一個HTML頁面就能夠在任何瀏覽器中運行的時代結束了。
對開發人員而言,如果想繼續保持Web跨平臺的天性,就必須額外多做一些工作。而人們真正擔心的是,如果不對Netscapet和微軟加以控制,Web開發領域就會出現技術上兩強割據,瀏覽器互不兼容的局面。此時,負責制定Web通信標準的W3C(World Wide Web Consortium,萬維網聯盟)開始著手規劃DOM。
圖 1-2
2. DOM級別
DOM1級(DOM Level 1)于1998年10月成為W3C的推薦標準。DOM1級由兩個模塊組成:DOM核心(DOM Core)和DOM HTML。其中,DOM核心規定的是如何映射基于XML的文檔結構,以便簡化對文檔中任意部分的訪問和操作。DOM HTML模塊則在DOM核心的基礎上加以擴展,添加了針對HTML的對象和方法。
請讀者注意,DOM并不只是針對JavaScript的,很多別的語言也都實現了DOM。不過,在Web瀏覽器中,基于ECMAScript實現的DOM的確已經成為JavaScript這門語言的一個重要組成部分。
如果說DOM1級的目標主要是映射文檔的結構,那么DOM2級的目標就要寬泛多了。DOM2級在原來DOM的基礎上又擴充了(DHTML一直都支持的)鼠標和用戶界面事件、范圍、遍歷(迭代DOM文檔的方法)等細分模塊,而且通過對象接口增加了對CSS(Cascading Style Sheets,層疊樣式表)的支持。DOM1級中的DOM核心模塊也經過擴展開始支持XML命名空間。
DOM2級引入了下列新模塊,也給出了眾多新類型和新接口的定
一幅濃墨重彩的語言畫卷,一部推陳出新的技術名著
全能前端人員必讀之經典,知識更新必備之佳作。
是正版,學習JavaScript的經典書目,適合入門,中級水平的人閱讀。大促時購買的,很劃算
javascript最透徹的一部經典。不可錯過。帶你深入游覽javascript的世界。對于要深入學習javascript的人,有巨大裨益。至于初學者或者想簡單了解js的人,這部書的內容有點豐富。
第二次買技術書,第一次買這么厚的書…看得我好芳…理論性好強,有些術語根本沒聽過看過,看來要學好還是得看點書,懂點理論…當然操作也必不可少…這本書 我覺得至少要看兩遍額…
收到書,我笑了,感覺和自己在學校打印的畢業設計的紙質一模一樣的,也許是我太久沒看紙質書了,也許現在的印刷用紙都是這樣子的,和我前二年買的PHP圣經和JS犀牛書紙質完全不一樣,不過我是沖著內容買的,這個可以接受。
書感覺還是不錯,很厚的一本,收到翻看了里面的內容,覺得這就是我需要的書,買了決不會后悔,內容很豐富同時也不是繁瑣的去探究底層的,感覺不錯
javascript的經典讀物,內容排列合理,代碼實例很多。不論是初學者還是有一定javascript編程經驗的人都能從中收益。圖靈的編程書就是牛。
非常喜歡這個作者,想買他的《高性能Javascript》可惜沒貨了。JavaScript高級程序設計,以前買過這本書的第一版,但發現第三版變化很大,覺得入手一本!
之前買了一本權威指南了,現在有入手一本高級編程,兩本一起讀,書很好,喜歡JavaScript,并希望自己從入門變成精通
JavaScript高級程序設計 這本買錯了= =
前端開發一定要看,前端開發一定要看,前端開發一定要看,重要的事情說三遍,從頭到尾都是精華,滿滿的知識點,真的像網上說的一樣,前端開發應該看三遍,也不為過。推薦推薦
只問一個問題,這是正版嗎?為什么紙質看起來泛黑,而且很薄。我是買來送人的,這怎么拿出手……覺得這個價錢有些不值,原本是信賴當當網,書的話就沒在其他網站買,結果讓人有些失望。
js這本書感覺很不錯,紙張也不錯,印刷也好,還沒看,不知道內容怎樣。換購的一本ps app的書真心的差,紙質很差,二十幾呢說滴,還很丑,看了一分鐘熏腦子,建議大家千萬不要換購!!!!像甲醛一樣!
我建議這本書等你對JavaScript有足夠的認識,基本入門以后再來看,不然這么夠的書,你看不懂時會覺得厭煩,當你入門時,閱讀起來有一陣陣驚喜!
怎么評論,書只有大家看了才知道好不好,看了或許也不知道,只有用了才知道,用了也有可能不知道好不好,只有找工作的時候被面試官問到才算好,總之最后能通過這本書拿到高薪才是好。
真的是本好書,從基礎到高級,講解十分詳細,案例也很清晰,從底層到高層都很明了。書本印刷質量很高,厚厚的一本,等我看完一定很有成就感。如果每章能夠加上一些練習題就更好了。
第一次在在當當買書,無錫到蘇州,下單的時候顯示當天送達,最后第三天才送到。顯示發貨,最后詢問的時候卻說是因為沒有貨才會晚。書本身出來包裝一般外沒什么好說的,只是這個物流感覺有待改善。
書收到了 紙質不錯的是正版 大概看了一下還沒有印刷錯誤 但是.. 這本書拿到手后想起來前幾天在圖書館看到過可以借閱的 尷尬了 好好學習 留下一本以后做代碼的時候常常查看也不錯的
圖靈的書看著很親切,這本書適合有一定JS基礎渴望在此基礎上有新的突破的人士使用,知識點比較多,記起來不容易啊,在瀏覽器兼容方面講的也比較詳細,重點在記憶阿在記憶,用了半年了,技術上有提高,現在來來回回看了有兩遍了,要想掌握的很好,十遍是少不了的。
老師推薦的書,快遞很給力,昨天下午兩點半提交的訂單,今天十二點一十五分就到貨了。但是一拿到貨,裝書的紙皮就破破爛爛的了,側面已經開了,于是我將書拿出,不過還好,數量沒有少。書的具體內容還沒有看,慢慢研究吧,望能在此書中受益,不斷進步。
這本書不用說了,高級程序設計,現在還看不懂,新手先認真鞏固基礎知識吧,包裝很好,書很新,價格還算可以,外國人出版的編程書必定不錯的,思維什么的都很嚴謹
這真的是最經典的JavaScript書,第二次看,還是感嘆其中的思想,很多直擊JavaScript的核心,但是需要你自己有很扎實的基本功,也確實如同很多人所講,它真的不是一本入門書。
經典就是經典,買過的這么多書當中,算是讀得最認真、讀的次數最多的一本了,每一次重新閱讀總能收獲不少東西,整書都非常通俗易懂。讀完又工作一段時間實踐后再來看一下,會更加深入的理解書里面講的知識點。 不可多得的JS教程,32個贊~~~