新書推薦:
《
敦煌通史:魏晋北朝卷
》
售價:HK$
162.3
《
唯美手编16:知性优雅的编织
》
售價:HK$
54.9
《
情绪的惊人力量:跟随内心的指引,掌控情绪,做心想事成的自己
》
售價:HK$
50.4
《
棉的全球史(历史·文化经典译丛)
》
售價:HK$
109.8
《
超越百岁看这本就够了
》
售價:HK$
55.8
《
亚洲戏剧史·南亚卷
》
售價:HK$
143.4
《
中国历代竹器图谱与数字活化
》
售價:HK$
557.8
《
EDA技术与设计(第2版)
》
售價:HK$
85.0
|
編輯推薦: |
绿皮书正式版:经过前两个版本的积累和历经三年的全面重写,这本书终于达成技术剖析和用户体验的完美契合
广深铸就宏篇:论深,本书深究JS之所以然,举世无可出其右;论广,本书遍历语义之细部,看罢再无机理之惑
超语言之思想:万法归宗异曲同工,剥去JS外壳,本书居高处辨析语言奥义的技术大局观,适用于所有编程语言
修炼重在重学:混合App|Node服务端|FaaS云原生|前端智能化时代,回归本质重修这门基础课才能走得更远更快
|
內容簡介: |
JavaScript 是一门包含多种语言特性的混合范型语言,在面向对象和函数式语言特性方面表现尤为突出,且在 ES6 之后所添加的并行语言特性也极为出色。本书基于 ES6,并涵盖*的 ES2019 规范,全面讲述 JavaScript 在五个方面的语言特性,以及将这些特性融会如一的方法。本书不但完整解析了 JavaScript 语言,还逐一剖析了相关特性在多个开源项目中的编程实践与应用,是难得的语言学习参考书。本书作者在前端开发领域经验丰富、深耕不辍,一书三版,历经十余年。书中对 JavaScript 语言的理解与展望,尤其适合期望精通这门语言的中高级程序员和语言实践者阅读。
|
關於作者: |
周爱民 Aimingoo 南潮 ruff.io 架构师、知名JavaScript专家。从1996年开始涉足商业软件开发,在软件开发、软件工程、团队建设以及部门管理方面经验丰富,曾任支付宝中国公司业务架构师、盛大网络平台架构师、豌豆荚架构师等职。著有《Delphi源代码分析》《大道至简》《大道至易》《程序原本》《动态函数式语言精髓》《 我的架构思想》《 JavaScript语言精髓与编程实践》等图书。
|
目錄:
|
第 1 章 二十年来的 JavaScript ............................................................................................... 1
1.1 网页中的代码 ........................................................................................................................................ 1
1.1.1 新鲜的玩意儿 ............................................................................................................................ 1
1.1.2 写在网页中的第一段代码 ........................................................................................................ 2
1.1.3 最初的价值 ................................................................................................................................ 3
1.2 用 JavaScript 来写浏览器上的应用 ...................................................................................................... 5
1.2.1 我要做一个聊天室 .................................................................................................................... 5
1.2.2 Flash 的一席之地 ....................................................................................................................... 7
1.2.3 RWC 与 RIA 之争...................................................................................................................... 8
1.3 没有框架与库的语言能怎样发展呢 ....................................................................................................10
1.3.1 做一个框架 ...............................................................................................................................10
1.3.2 重写框架的语言层 ...................................................................................................................13
1.3.3 富浏览器端开发(RWC)与 AJAX ........................................................................................14
1.4 语言的进化 ...........................................................................................................................................16
1.4.1 Qomo 的重生 ............................................................................................................................16
1.4.2 QoBean 是对语言的重新组织 .................................................................................................17
1.4.3 JavaScript 作为一门语言的进化 ..............................................................................................18
1.5 大型系统开发 .......................................................................................................................................20
1.5.1 框架与架构是不同的 ...............................................................................................................20
1.5.2 大型系统与分布式的环境 .......................................................................................................21
1.5.3 划时代的 ES6............................................................................................................................23
1.6 为 JavaScript 正名 .................................................................................................................................24
1.6.1 JavaScript ..................................................................................................................................25
1.6.1.1 Core JavaScript ...........................................................................................................26
1.6.1.2 SpiderMonkey JavaScript ...........................................................................................27
1.6.1.3 JScript .........................................................................................................................27
1.6.2 ECMAScript ..............................................................................................................................28
1.7 JavaScript 的应用环境 ..........................................................................................................................29
1.7.1 宿主环境 ...................................................................................................................................30
1.7.2 外壳程序 ...................................................................................................................................31
1.7.3 运行期环境 ...............................................................................................................................32
1.7.4 兼容环境下的测试 ...................................................................................................................34
第 2 章 JavaScript 的语法 ..................................................................................................... 36
2.1 语法综述 ...............................................................................................................................................36
2.1.1 标识符所绑定的语义 ...............................................................................................................37
2.1.2 识别语法错误与运行错误 .......................................................................................................38
2.2 JavaScript 的语法:声明 ......................................................................................................................40
2.2.1 变量的数据类型 .......................................................................................................................40
2.2.1.1 基本数据类型 ............................................................................................................41
2.2.1.2 宿主定义的其他对象类型 ........................................................................................42
2.2.1.3 值类型与引用类型 ....................................................................................................42
2.2.1.4 讨论:ECMAScript 的类型系统 ..............................................................................43
2.2.2 变量声明 ...................................................................................................................................45
2.2.2.1 块级作用域的变量声明与一般 var 声明 .................................................................47
2.2.2.2 用赋值模板声明一批变量 ........................................................................................48
2.2.3 使用字面量风格的值 ...............................................................................................................48
2.2.3.1 字符串字面量、转义符 ............................................................................................49
2.2.3.2 模板字面量 ................................................................................................................51
2.2.3.3 数值字面量 ................................................................................................................52
2.2.4 其他声明 ...................................................................................................................................53
2.2.4.1 常量声明 ....................................................................................................................53
2.2.4.2 符号声明 ....................................................................................................................54
2.2.4.3 函数声明 ....................................................................................................................55
2.3 JavaScript 的语法:表达式运算 ..........................................................................................................56
2.3.1 一般表达式运算 .......................................................................................................................59
2.3.1.1 逻辑运算 .....................................................................................
|
內容試閱:
|
推荐序 1
一本不是所有人都需要的好书
这个有点绕口的标题,是从豆瓣上本书第 1 版的一个书评标题照录而来的。豆瓣上排名前列的评论还有这是一本硬书国内技术原创书中稀有的异数等。实际上,我觉得不仅是国内,算上在市面上能看到的所有 JavaScript 相关的书,本书都绝对堪称硬书异数。
传统上,许多大部头的 JavaScript 相关的图书,会有大量篇幅介绍 DOM 相关的 API 和如何结合语言与平台 API 进行 Web 前端编程,这些年也可能换成是 Node.js 的 API 和服务器端编程。从入门或进阶来说,这样的编排都是合适的,因为结合特定平台和领域的具体编程实践可以更快速地建立学习的正向反馈。专注 JavaScript 语言本身的书也不是没有,ES6 时代到来之后,颇有几本书全面细致地介绍了 JavaScript 语言的新特性。甚至有很有名的书,会一直讲到不为多数人所知的语言细节,受到中高级开发者的追捧。不过这些书还都是用来学习语言的书。
爱民的这本书,却不是一本学习用的书,而是一本阐释用的书。不要说 JavaScript 初学者,就算你有三五年甚至十年的 JavaScript 开发经验,读起这本书可能也不易。因为绝大部分开发者不习惯这样思考问题。比方说,这本书大的章节是按照结构化、面向对象、函数式、动态化等编程范式来展开讨论的,最新版中还加入了并行计算。
有些读者或许也看过一些谈编程范式的书,甚至专门谈在 JavaScript 语言中使用某一种编程范式的书(比如近年来随着某框架而在 JavaScript 圈逐渐火起来的函数式编程),但这些书还都是引领你学习一个范式,教你应用一个范式的书。爱民这本书的出发点与其他书不同,并不是为了学习、应用范式,而是为了分析编程语言,取之为线索。为此,需要系统性地逐一论述多种主要范式,然后将 JavaScript 语言的要素分解并归纳入不同范式下进行讨论。需要注意的是,JavaScript 语言与每种范式代表性的经典编程语言都有很大的不同。所以在这个过程中,读者也可以注意体悟多种范式是以怎样一种方式不完美却可用地并存于 JavaScript 这门语言之中的。
在每章的开始,先有十数页的概述来论述范式和其背后的思想源流,故这一部分几乎总是要以跳出 JavaScript 这单一语言的视角来论述的。这些概述也绝不是简单地从其他书或资料中拿一些内容拼凑而成的,而是爱民以自己数十年编程和架构的心得理解精炼而成的。光这些概述,在本书第 1 版出版时的技术图书市场上前所未见,到今日 JavaScript 的相关图书汗牛充栋,恐怕也仍然独此一家。
不过,这也带来一个问题,就是对于绝大多数读者来说,概述可能反而比后续章节更难读,初读时一知半解。
这次爱民要出第 3 版,寄赠我一些样稿,我读到第 4 章概述中论及结构化的疑难是抽象层次过低,而面向对象范式正是对此的应答时,颇有茅塞顿开之感。但后来重新翻阅 12 年前爱民赠我的本书第 1 版,才发现已包含了这段论述。可见当年我恐怕也是囫囵吞枣,虽读之也并不能领会消化。
然而即使我现在提到了这个段落,读者可能特意去认真阅读该段落,记住了、理解了,也不见得能产生直接的用处。打个不一定恰当的比喻,金庸的《射雕英雄传》中周伯通讲《九阴真经》:这上卷经文中所载,都是道家修炼内功的大道,以及拳经剑理,并非克敌制胜的真实功夫,若未学到下卷中的实用法门,徒知诀窍要旨,却是一无用处。
市面上大部分技术图书,都是讲实用法门的,偶尔讲一点拳经剑理。爱民写这本书的终极目标其实是传授内功大道,为此拿了一门最流行的武功(语言)来拆解剖析,总结出其独特的拳经剑理,以印证大道。在这个阐释的过程中,实用法门讲的不多,即使讲了一些,也意不在此。事实上,很多人只是想要实用法门的书,最好还是速成的。那就最好不要选本书了。这种需求也不好说错。或许先讲实用法门,再讲拳经剑理乃至大道,才是符合普通人的认知规律的。
另一方面,即使一个人也有意于拳经剑理乃至大道,如果市面上全是讲实用法门的书,他一直以来熟悉的只有这个套路,就会对其他模式不太适应。比如说,对一个语言特性的解说和评论,绝大部分图书的讲法主要基于实用,也就是,有什么用,怎么用,用起来顺手不顺手。但爱民这本书的视角就很不一样,主要是基于大道和拳经剑理的内在逻辑进行推演。
需要理解的是,这两个方向可能互相印证,也可能产生矛盾。编程语言和一切复杂的人造事物一样,是不完美的。
这也会延伸到语言设计上。作为程序员,虽然看到新语言特性的介绍通常还都是从实用角度讲解(宣传)的,但在设计阶段,其实要接受各个维度、不同层面的需求和约束。语言特性要平衡多种不同因素,平衡不了就要做取舍。但这个取舍到底是不是合适,就见仁见智了。
爱民在这次新版的第 4 章中花了不少篇幅讨论目前 stage 3 的类字段(class fields)提案和他设计的替代性方案。这个提案比表面上看起来要复杂得多,无论是在委员会还是在社区里,不同的人的看法会非常不同,而且这种分歧贯穿了大道拳经剑理实用法门各个层面。需要注意,即使持同样立场的人,比方说同样反对现有提案,其背后的原因也可能截然不同,对解决路径的判断也会截然不同。TC39 是基于一致同意的方式推进工作的。对于接受现有提案的人来说,即使其认知不同,但至少表面上是达成一致的。而对不同意现有提案的人,各有各的不同意,因而也无法达成一致。表现出来的结果,就是爱民在书中所说:类字段提案提供了一个极具争议的私有字段访问语法,并成功地做对了唯一一件事情,让社区把全部的争议焦点放在了这个语法上。这也是类字段提案的悲剧性之所在。
我认为,讨论这个话题的价值,不在于给出一个答案(毕竟 TC39 都给不出令人满意的答案),而是这个思考过程。在这个过程中,我们需要同时考虑大道(面向对象范式)、拳经剑理(JavaScript 现有的语法和语义约定和约束,与后续提案的关系和协调性等)、实用法门(使用方式、如何满足各种需求、代码风格、性能)等不同的层面。这是一个极好的思维训练,在这个过程中,无论你得到怎样的结论,都会对 JavaScript 语言有更深
层次的认知和把握。而这样的内容,也只能存在于阐释之书中。
然后说说对阐释可能存在的疑问。那就是多种不同的甚至矛盾的阐释是否可以共存,有没有一种解释是最正确的,或者权威的。
举一个小例子, typeof null 为什么返回 "object" ?从历史事实来说,根据Brendan Eich 自己的说法,这是无心之失。但爱民的意见,这也可以理解为 null 实为对象类型的特殊值。6年前我在知乎上对这种阐释做了较为详细的解说。按照一般认知,Brendan Eich 自己的说法当然是最正确和权威的。然而有意思的是,前不久,在 Allen Wirfs-Brock 和 Brendan Eich 合作撰写并提交给 HOPL 会议的论文 JavaScript : The First 20 Years 中写道:
令人困惑的是,typeof null 会返回字符串值"object"而不是"null"。其实也可以说这与Java 保持了一致,因为 Java 中的所有值都是对象,而 null 本质上是表达没有对象的对象根据 Brendan Eich 的回忆, typeof null 的值是原始 Mocha 实现中抽象泄露的结果。 null 的运行时值使用了与对象值相同的内部标记值进行编码,因此 typeof 运算符的实现就直接返回了"object"。
引自 doodlewind 的中文译本,原文在预印本第 12 页
这篇权威论文同时列出了这两种解释。所以爱民很多年前的阐释也算被官宣了。有人可能要打破砂锅问到底,到底哪一种才是正确的呢?其实我认为都是正确的。
Brendan Eich 的回忆可能是历史真相,但当事人的回忆不一定是真相的全部。我们可以追问,为什么当初在实现的时候,对象和 null 共享了相同的标记值呢?一种解释是,可能是当年有意识根据 Java 的 null 值表示没有对象,来对 JavaScript 中的 null 值进行建模的副产品,另一种解释是编程中无意产生的结果。即使是后一种,如果考虑引擎是如何实现的,就会发现对象引用的内部表达肯定是一个内存地址,那么很自然就会以全0的地址代表 null 。
那么可以说,导致这种抽象泄露本身的源头是高层模型到具体实现的自然映射,偶然性中蕴含了必然性。另外,我们也可以追问,为什么当初标准化的时候,没有对 typeof null 的结果提出异议呢?不太可能委员会中的所有成员都没有发现,所以一个合理猜想是,发现这个问题的人也采用了类似爱民的阐释对这个行为进行了合理化。
其实在日常生活中,有大量这种既是机缘巧合又冥冥中自有定数的事例,在技术领域其实也一样。
这当然不是说,任意一种阐释都是正确的,阐释本身得自洽,然后有足够的解释效力,具有普适性,不会引发反例,引入一种阐释的成本不应该大于收益,最后还要经得起奥卡姆剃刀原则的考验。要做到这些是非常困难的,有时候是难以判断的。包括本书对 JavaScript 语言的各种阐释,肯定不是所有人都认同的,包括我自己,对其中某些部分也会有不同意见。但是程序员从码农成长起来,可以进行更大范围、更高层次的设
计,乃至以成为像爱民那样的架构师为职业目标,这就需要提升对各种不同阐释的理解判断及融会贯通的能力,并逐步形成自己对技术进行阐释的能力。从这点来说,这本硬书在那么多 JavaScript 书中是
|
|