JavaScript核心原理:規(guī)范、邏輯與設(shè)計
定 價:¥99.8
中 教 價:¥59.88 (6.00折)
庫 存 數(shù): 14
叢 書 名:前端技術(shù)專家修煉系列
本書是一本JavaScript精進指南,全面剖析JavaScript的核心技術(shù)。全書共分為6篇,第一篇講解JavaScript的基礎(chǔ)概念,第二篇講解JavaScript的運行過程,第三篇講解JavaScript面向?qū)ο缶幊腆w系中最核心的設(shè)計,第四篇講解JavaScript作為動態(tài)語言的主要特性,第五篇講解JavaScript作為并行語言的主要持性,第六篇講解ECMAScript 2019之后的新增特性,并對ECMAScript 2022之后將添加的特性進行解析。 每章用一行代碼引出,所講內(nèi)容包括該行代碼的特殊性、所涉問題的領(lǐng)域、逐步的解析、相似或同類的問題、潛在的應(yīng)用、不為人知的歷史、標準規(guī)范對此代碼的態(tài)度、業(yè)界的看法與爭議等。 本書適合有一定編程基礎(chǔ)的JavaScript開發(fā)人員與深度愛好者閱讀,幫助讀者深入理解JavaScript核心原理,實現(xiàn)從粗通到精通的進階。
1.細致講解核心知識點。借由ECMAScript規(guī)范的設(shè)計來討論JavaScript核心的語言特性的演進與發(fā)展,并瞻見這門語言的未來。2.詳細介紹JavaScript語言。探索JavaScript語言為什么這樣設(shè)計,以及這樣的設(shè)計對寫代碼有什么影響,講解JavaScript的執(zhí)行現(xiàn)場和可執(zhí)行結(jié)構(gòu),揭開執(zhí)行系統(tǒng)的面紗。3.以通俗易懂的方式呈現(xiàn)JavaScript的動態(tài)語言特性,揭示所謂嚴格模式在全局環(huán)境中的部分真相。
周愛民,國內(nèi)軟件開發(fā)界資深架構(gòu)師、軟件工程師。有20余年的軟件開發(fā)與架構(gòu)、項目管理、團隊建設(shè)的經(jīng)驗,曾任盛大網(wǎng)絡(luò)平臺架構(gòu)師、支付業(yè)務(wù)架構(gòu)師、豌豆英架構(gòu)師和上海南潮架構(gòu)師等職。從1998年開始了解并應(yīng)用JavaScript,著有前端綠皮書《JavaScript語言精髓與編程實踐》,曾發(fā)布Qomo、 QoBean及分布式架構(gòu)框架N4C等開源項目。已出版的其他作品有《大道至簡》 《大道至易》和《Delphi源代碼分析》。
第 一篇 從零開始:重新認識JavaScript語言的基礎(chǔ)概念第 1章 生存周期:JavaScript變量與引用的銷毀 21.1 習(xí)慣中用引用來區(qū)別數(shù)據(jù)類型的操作方式 31.1.1 刪除運算到底在試圖銷毀什么 41.1.2 表達式的結(jié)果是什么 41.2 深入理解引用(規(guī)范類型) 51.3 引用在引擎內(nèi)部的主要行為 61.4 從引用的發(fā)現(xiàn)到銷毀 61.5 小結(jié) 7第 2章 賦值:賦值過程中出現(xiàn)變量泄露的原因 92.1 從變量聲明到賦值綁定的全程解析 102.1.1 賦值在語言設(shè)計中稱為綁定 112.1.2 用賦值語法實現(xiàn)綁定導(dǎo)致的問題 122.2 變量泄露:向一個不存在的變量賦值 122.3 在連續(xù)賦值過程中發(fā)生的行為細節(jié) 142.4 在應(yīng)用中使用賦值語句魔法的技巧 152.5 小結(jié) 16第3章 表達式:對運算過程的觀察與分析 173.1 在運算過程中丟失的數(shù)據(jù)的難解之謎 183.1.1 深度解析聲明語句與賦值表達式的語義差別 183.1.2 來自《JavaScript權(quán)威指南》的解釋 193.2 表達式連續(xù)運算過程中的變量、值與引用 203.3 用代碼重現(xiàn)引用覆蓋的現(xiàn)場 213.4 技術(shù)的取巧之處 223.5 小結(jié) 23第4章 名字與導(dǎo)出:有名字是構(gòu)建邏輯的基礎(chǔ) 244.1 能導(dǎo)出的只有名字和值 254.1.1 代碼就是文本 254.1.2 詳解export的語法與語義 254.2 export導(dǎo)出名字的具體邏輯 274.2.1 導(dǎo)出:同化名字與值的處理邏輯 274.2.2 綁定:通過執(zhí)行頂層代碼實現(xiàn)的裝配過程 284.2.3 問題:函數(shù)表達式執(zhí)行中不綁定名字 284.3 匿名函數(shù)定義及其名字處理 294.4 有關(guān)導(dǎo)出語句的一些補充 304.5 小結(jié) 31第5章 作用域:循環(huán)計算成本高昂的原因 325.1 代碼分塊與塊級作用域 335.2 循環(huán)語句中的塊 345.2.1 特例 355.2.2 特例中的特例 355.3 第二個作用域的必要性 365.4 for循環(huán)在運行時需要更多作用域 375.5 小結(jié) 38第二篇 從表達式到執(zhí)行引擎:運行代碼的核心機制第6章 執(zhí)行環(huán)境的秘密:語句的運行與完成的視角 406.1 用中斷代替跳轉(zhuǎn) 416.1.1 跳轉(zhuǎn)到語句結(jié)束的位置 416.1.2 跳轉(zhuǎn)到標簽約定的位置 426.2 執(zhí)行現(xiàn)場的回收 436.3 語句執(zhí)行的意義 446.4 中斷語句的特殊性 456.4.1 最小化的break語句 466.4.2 返回empty的語句 466.5 小結(jié) 46第7章 深入探索JavaScript中的特殊執(zhí)行體 477.1 抽象確定邏輯的執(zhí)行體 487.2 幾種特殊的可執(zhí)行結(jié)構(gòu) 487.2.1 參數(shù)表 487.2.2 擴展風(fēng)格的參數(shù)表 497.2.3 賦值模式 507.3 模板字面量 527.4 小結(jié) 53第8章 閉包、函數(shù)與函數(shù)式編程語言的關(guān)系 548.1 函數(shù)的一體兩面 558.1.1 在運行期一個實例有多個閉包 558.1.2 閉包用于承載兩個語義組件 568.2 簡單參數(shù)類型 578.2.1 傳入?yún)?shù)的處理 578.2.2 意外 588.2.3 未初始化綁定 588.3 最小化的函數(shù)式編程語言示例 598.4 小結(jié) 60第9章 迭代過程及其出錯處理機制 619.1 遞歸與迭代 629.1.1 迭代對執(zhí)行過程的重造和使用 639.1.2 展開語法 639.2 JavaScript中如何實現(xiàn)迭代處理 649.2.1 內(nèi)部迭代過程 649.2.2 不可思議的異常處理邏輯 659.3 在迭代中處理異常的關(guān)鍵:誰是使用者 669.4 小結(jié) 68第 10章 從迭代向生成器函數(shù)演進的過程 6910.1 將迭代過程代表的循環(huán)邏輯展開 7010.2 用生成器函數(shù)對循環(huán)邏輯進行二次重構(gòu) 7110.3 由next()方法負責(zé)執(zhí)行引擎的喚起 7310.4 為next()方法的傳入?yún)?shù)賦予新的意義 7310.5 小結(jié) 74第 11章 ECMAScript規(guī)范起步 7511.1 第三行:返回結(jié)果 7611.2 第二行:取引用的值 7711.2.1 語句的執(zhí)行者 7711.2.2 執(zhí)行期值的覆蓋與讀取 7811.2.3 取引用值的具體方法 7911.3 第 一行:從執(zhí)行到取結(jié)果的基礎(chǔ)模式 8011.4 在ECMAScript中如何理解值1 8011.5 小結(jié) 81第三篇 從原型到類:向應(yīng)用編程語言的進化第 12章 詳解屬性及其性質(zhì) 8412.1 JavaScript 1.0~1.3中的對象 8512.1.1 面向?qū)ο蟮幕A(chǔ)設(shè)計與實現(xiàn) 8512.1.2 屬性存取及其可見性問題 8612.2 自有屬性與從原型中繼承來的屬性 8712.3 字面量、標識符與屬性 8812.4 屬性存取的不確定性 8812.5 小結(jié) 89第 13章 從構(gòu)造器到類:創(chuàng)建對象的方法 9013.1 JavaScript支持繼承的歷史 9113.1.1 基于對象的JavaScript 9113.1.2 類與構(gòu)造器 9113.1.3 ES6之后的類 9213.1.4 總結(jié) 9313.2 兩種創(chuàng)建對象this的順序 9413.3 改變對象創(chuàng)建的結(jié)果 9513.4 小結(jié) 96第 14章 從無到有:訪問父類的能力 9714.1 面向?qū)ο笤缙谠O(shè)計中的概念抽象 9814.2 為什么要有super 9814.3 super指向什么 9914.4 調(diào)用父類方法super.xxx() 10014.4.1 super.xxx()中的this值 10014.4.2 super()中的父類構(gòu)造方法 10114.4.3 構(gòu)造方法在設(shè)計時面臨的選擇 10214.5 訪問父類屬性super.xxx 10214.6 小結(jié) 103第 15章 實現(xiàn)用戶自定義的構(gòu)建過程 10515.1 自定義構(gòu)建過程的必要性 10615.1.1 關(guān)于隱式的構(gòu)造方法 10615.1.2 非派生類不用調(diào)用super() 10715.2 定制的構(gòu)造方法 10815.3 定制構(gòu)造器能返回任意對象 10915.4 小結(jié) 109第 16章 數(shù)據(jù)結(jié)構(gòu)視角下的對象本質(zhì) 11116.1 對象的前世今生 11216.2 兩種數(shù)據(jù)結(jié)構(gòu) 11316.3 結(jié)構(gòu)的反面:解構(gòu) 11416.4 對象將兩種數(shù)據(jù)結(jié)構(gòu)合而為一 11516.5 小結(jié) 117第 17章 原子層級上的對象與行為 11817.1 null值 11917.2 Null類型 12017.3 null是所有原子對象的父類實例 12117.4 從繼承性的角度觀察原子對象 12217.4.1 派生自原子的類 12217.4.2 一般函數(shù)/構(gòu)造器 12317.5 原子行為 12417.6 小結(jié) 124第四篇 從粗通到精通的進階之路:唯一不變的是變化本身第 18章 原始值:類型系統(tǒng)運算的終極目標 12618.1 類型系統(tǒng)的簡化 12718.1.1 從值到對象的類型轉(zhuǎn)換 12718.1.2 對象可以轉(zhuǎn)換成哪些值 12718.1.3 值與值之間的轉(zhuǎn)換 12918.2 問題:將數(shù)組和對象相加會發(fā)生什么 13018.3 分析:隱式轉(zhuǎn)換中的意圖推斷和轉(zhuǎn)換過程 13118.3.1 返回值本身 13118.3.2 返回內(nèi)部槽中的原始值 13218.3.3 作為原始值處理 13218.3.4 使用傳統(tǒng)的類型轉(zhuǎn)換邏輯 13318.4 解題 13318.4.1 從對象到原始值的轉(zhuǎn)換 13318.4.2 加號運算符的特殊性 13418.4.3 字符串在加號運算符中的優(yōu)先權(quán) 13418.4.4 預(yù)期情況與非預(yù)期情況下的處理 13518.5 Date特例的進一步分析 13618.6 小結(jié) 137第 19章 JavaScript實現(xiàn)動態(tài)執(zhí)行時的基礎(chǔ)設(shè)施 13819.1 eval執(zhí)行對傳入?yún)?shù)的理解 13919.2 eval執(zhí)行對環(huán)境的要求 13919.2.1 環(huán)境 14019.2.2 執(zhí)行上下文 14019.2.3 管理 14119.2.4 不用于執(zhí)行的環(huán)境 14219.2.5 eval()的環(huán)境 14319.3 特殊的非嚴格模式的全局 14419.4 小結(jié) 145第 20章 非嚴格模式的全局環(huán)境中的動態(tài)執(zhí)行 14620.1 在全局環(huán)境中的eval 14720.2 名字之爭:對eval安全性的權(quán)衡 14820.3 嚴格模式是執(zhí)行限制而不是環(huán)境屬性 14920.4 直接調(diào)用與間接調(diào)用的對比 15020.5 為什么本章標題下的代碼是間接調(diào)用 15120.6 eval()怎么返回結(jié)果 15320.7 小結(jié) 154第 21章 動態(tài)函數(shù)及其工作原理 15521.1 動態(tài)創(chuàng)建函數(shù)的方法 15621.1.1 得到函數(shù)的幾種途徑 15621.1.2 幾種動態(tài)函數(shù)的構(gòu)造器 15721.1.3 函數(shù)的3個組件 15721.1.4 動態(tài)函數(shù)的創(chuàng)建過程 15821.2 動態(tài)函數(shù)與其他函數(shù)的一致性 15921.3 動態(tài)創(chuàng)建函數(shù)與間接調(diào)用eval()的唯一差異 15921.4 小結(jié) 160第五篇 從有序中抽離時間:并行的本質(zhì)不是有序而是重復(fù)第 22章 Promise的精華:then鏈 16222.1 早期JavaScript中的并行邏輯 16322.2 從回調(diào)到Promise的then鏈 16422.2.1 then鏈與其他主要概念之間的關(guān)系 16422.2.2 并生體:從then鏈的本質(zhì)來理解時間剝離 16522.3 then鏈的起始端:resolve()/reject()置值器 16622.4 通過then鏈交付數(shù)據(jù) 16822.4.1 p.then(f)中f的傳入值 16822.4.2 p.then(f)中f的返回值 16922.5 小結(jié) 170第 23章 then鏈中的異數(shù):Thenable對象與類型模糊 17123.1 Thenable是行為化的Promise 17223.1.1 Thenable是通過特定界面向外界陳述自身值的對象 17223.1.2 then方法需要有執(zhí)行回調(diào)的潛在能力 17323.2 Thenable值的可變性及其影響 17423.3 Thenable中then()的返回值 17623.4 then()的主動喚起與被動喚起 17723.5 Thenable的概念轉(zhuǎn)換與類型模糊 17723.6 小結(jié) 178第 24章 Promise類與子類 18024.1 Promise類的應(yīng)用:以Hello world程序為例 18124.1.1 用三元組替代Promise的行為 18124.1.2 執(zhí)行器中的其他邏輯 18224.2 類上的原型方法:以異常處理為例 18224.3 子類及其構(gòu)造方法的界面 18424.3.1 定制執(zhí)行器邏輯及其返回 18424.3.2 定制構(gòu)造方法的界面 18524.4 小結(jié) 186第 25章 精巧的設(shè)計:await/async 18725.1 異步函數(shù)與異步上下文 18825.1.1 異步上下文的獨特之處 18825.1.2 異步在多次調(diào)用的不同表現(xiàn) 18925.2 await上演的帽子魔法 19025.2.1 執(zhí)行棧上的細節(jié)變化 19025.2.2 處理數(shù)據(jù)x的詳細邏輯 19125.3 async/await以及yield等特殊的名字 19325.4 小結(jié) 195第 26章 并發(fā)與多線程 19626.1 ECMAScript中的線程并發(fā)模型 19726.1.1 多線程并發(fā)執(zhí)行環(huán)境 19726.1.2 資源爭用:并發(fā)執(zhí)行的核心沖突 19826.2 工作線程及其調(diào)度 19826.2.1 通知與數(shù)據(jù)交換 20126.2.2 游離狀態(tài)與調(diào)度模型 20126.2.3 現(xiàn)實環(huán)境 20126.3 持鎖訪問 20226.3.1 Atomics.wait()的細節(jié) 20526.3.2 lock()方法的使用以及它存在的問題 20626.3.3 資源規(guī)劃、競爭與死鎖 20826.4 小結(jié) 210第 27章 并發(fā)在分布式環(huán)境中的應(yīng)用 21127.1 從無視時間到管理時間 21127.2 靜態(tài)規(guī)劃的本質(zhì)是假設(shè)系統(tǒng)不受時間流逝的影響 21227.2.1 需要基于一個可通信網(wǎng)絡(luò) 21327.2.2 需要檢測資源狀態(tài) 21427.2.3 需要帶預(yù)備過程的兩階段提交 21527.2.4 用一對完整的請求/響應(yīng)來獲取資源 21527.3 游離狀態(tài)在分布式系統(tǒng)中的問題 21627.4 去中心化與分布式模型 21727.5 小結(jié) 218第六篇 致未來:新的語言特性第 28章 動靜之間的平衡:import() 22028.1 ES6模塊的主要問題 22128.1.1 瀏覽器端的特殊性 22128.1.2 服務(wù)器端的簡單需求 22228.1.3 ES6規(guī)范的選擇 22428.2 動態(tài)導(dǎo)入的模塊 22428.2.1 語法查錯 22528.2.2 決定時效性 22628.3 import()的出現(xiàn) 22628.4 瀏覽器生態(tài)下的動態(tài)導(dǎo)入 22728.5 受ESM模塊影響的網(wǎng)頁腳本執(zhí)行順序 23128.6 小結(jié) 232第 29章 所有的組合:Promise.allSettled()和Promise.any() 23329.1 組合的基本原則 23429.1.1 通過組合來擴展系統(tǒng)的外延 23429.1.2 尋求合理的補充 23529.1.3 少即是多的理念 23829.2 更多組合、更多選擇 23929.3 小結(jié) 241第30章 與null的長期斗爭:從 .到 24230.1 使用null和undefined的一些最佳實踐 24330.2 空值檢測的一些預(yù)期性質(zhì) 24530.3 問號的設(shè)計 24630.3.1 短路運算與 .運算符的短路設(shè)計 24630.3.2 是否存在一種新的語法設(shè)計風(fēng)格 24830.3.3 JavaScript運算符在設(shè)計上的限制 25130.4 小結(jié) 252第31章 塊的魔法:類強化過程中的那些方案 25431.1 代碼的組織:形式分塊 25531.1.1 信息隱蔽 25531.1.2 結(jié)構(gòu)化 25631.1.3 映射 25631.1.4 在JavaScript中代碼分塊與作用域的關(guān)系 25731.2 表達式級別的詞法作用域 25731.3 圍繞類或?qū)ο蟮男畔㈦[蔽進行的設(shè)計 26031.3.1 字段:TC39對信息隱蔽的理解 26131.3.2 塊:類構(gòu)造與實例構(gòu)造過程的組織與聯(lián)系 26431.3.3 類的進一步強化:塊化和注解化 26631.4 有關(guān)作用域的兩點補充設(shè)計 26831.5 小結(jié) 269第32章 計算與應(yīng)用:數(shù)據(jù)類型設(shè)計上的強化或概念擴展 27132.1 JavaScript的內(nèi)建數(shù)據(jù)類型與標準庫 27332.1.1 對象與標準庫 27332.1.2 標準庫的結(jié)構(gòu) 27332.1.3 強化標準庫的進展 27432.2 在基礎(chǔ)類型中對有序類型的進一步設(shè)計 27532.3 在內(nèi)存與線程相關(guān)技術(shù)中對應(yīng)用環(huán)境的更多考量 27832.4 宿主行為規(guī)范 28032.5 小結(jié) 283第33章 最后的屏障:頂層await 28533.1 模塊的狀態(tài) 28633.2 模塊的頂層代碼 28733.3 模塊頂層代碼中的await 28833.4 瀏覽器環(huán)境下的異步 29033.5 最后一塊落井石 29133.6 小結(jié) 294附錄A 22道測試題 295附錄B 測試題答案及解析 299