1
0
mirror of https://github.com/apachecn/eloquent-js-3e-zh.git synced 2025-05-28 15:12:20 +00:00
This commit is contained in:
wizardforcel 2018-06-01 18:10:13 +08:00
parent 6b18607843
commit dd602ae3be
2 changed files with 53 additions and 37 deletions

60
0.md
View File

@ -1,8 +1,22 @@
# 零、前言
这是一本关于指导电脑的书。时至今日,计算机就像螺丝刀一样随处可见,但相比于螺丝刀而言,计算机更复杂一些,并且,让他们做你想让他们做的事情,并不总是那么容易。
> 原文:[Introduction](https://eloquentjavascript.net/00_intro.html)
>
> 译者:[飞龙](https://github.com/wizardforcel)
>
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
>
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
>
> 部分参考了[《JavaScript 编程精解(第 2 版)》](https://book.douban.com/subject/26707144/)
![](../Images/00001.jpeg)
> We think we are creating the system for our own purposes. We believe we are making it in our own image... But the computer is not really like us. It is a projection of a very slim part of ourselves: that portion devoted to logic, order, rule, and clarity.
> Ellen Ullman《Close to the Machine: Technophilia and its Discontents》
![](img/0-0.jpg)
这是一本关于指导电脑的书。时至今日,计算机就像螺丝刀一样随处可见,但相比于螺丝刀而言,计算机更复杂一些,并且,让他们做你想让他们做的事情,并不总是那么容易。
如果你让计算机执行的任务是常见的,易于理解的任务,例如向你显示你的电子邮件,或像计算器一样工作,则可以打开相应的应用并开始工作。 但对于独特的或开放式的任务,应用可能不存在。
@ -57,29 +71,29 @@
01100010 00000000 00000000
```
该程序计算数字1~10之和并打印出结果1+2+…+10=55。该程序可以运行在一个简单的机器上。在早期计算机上编程时,我们需要在正确的位置设置大量开关阵列,或在纸带上穿孔并将纸带输入计算机中。你可以想象这个过程是多么冗长乏味且易于出错。即便是编写非常简单的程序,也需要有经验的人耗费很大精力才能完成。编写复杂的程序则更是难上加难。
该程序计算数字 1~10 之和,并打印出结果:`1+2+...+10=55`。该程序可以运行在一个简单的机器上。在早期计算机上编程时,我们需要在正确的位置设置大量开关阵列,或在纸带上穿孔并将纸带输入计算机中。你可以想象这个过程是多么冗长乏味且易于出错。即便是编写非常简单的程序,也需要有经验的人耗费很大精力才能完成。编写复杂的程序则更是难上加难。
当然了手动输入这些晦涩难懂的位序列1 和 0来编写程序的确能让程序员感到很有成就感而且能给你的职业带来极大的满足感。
在上面的程序中,每行都包含一条指令。我们可以用中文来描述这些指令:
1. 将数字0存储在内存地址中第0的位置。
1. 将数字 0 存储在内存地址中的位置 0
2. 将数字1存储在内存地址中第1的位置。
2. 将数字 1 存储在内存地址的位置 1
3. 将内存地址中第1的位置的值存储在内存地址中第2的位置。
3. 将内存地址的位置 1 中的值存储在内存地址的位置 2
4. 将内存地址中第2的位置的值减去数字11。
4. 将内存地址的位置 2 中的值减去数字 11。
5. 如果内存地址第2的位置的值是0则跳转到指令9。
5. 如果内存地址的位置 2 中的值是 0则跳转到指令 9。
6. 将内存地址第1的位置的值加到内存地址第0的位置上
6. 将内存地址的位置 1 中的值加到内存地址的位置 0
7. 将内存地址第1的位置上的值加上数字1。
7. 将内存地址的位置 1 中的值加上数字 1。
8. 跳转到指令 3。
9. 输出内存地址第0的位置上的值。
9. 输出内存地址的位置 0 中的值。
虽说这已经比一大堆位序列要好读了许多,但仍然不清晰。使用名称而不是数字用于指令和存储位置有所帮助:
@ -97,7 +111,7 @@
Output “total”.
```
现在你能看出该程序是如何工作的吗前两行代码初始化两个内存位置的值total用于保存累加计算结果而count则用于记录当前数字。你可能觉得compare的那行代码看起来有些奇怪。程序想根据count是否等于11来决定是否应该停止运行。因为我们的机器相当原始所以只能测试一个数字是否为0并根据它做出决策。因此程序用名为compare的内存位置存放count11的值并根据该值是否为0决定是否跳转。接下来两行将count的值累加到结果上并将count加1直到count等于11为止。
现在你能看出该程序是如何工作的吗?前两行代码初始化两个内存位置的值:`total`用于保存累加计算结果,而`count`则用于记录当前数字。你可能觉得`compare`的那行代码看起来有些奇怪。程序想根据`count`是否等于 11 来决定是否应该停止运行。因为我们的机器相当原始,所以只能测试一个数字是否为 0并根据它做出决策。因此程序用名为`compare`的内存位置存放`count11`的值,并根据该值是否为 0 决定是否跳转。接下来两行将`count`的值累加到结果上,并将`count` 1直到`count`等于`11`为止。
下面使用 JavaScript 重新编写了上面的程序:
@ -111,20 +125,20 @@ console.log(total);
// → 55
```
这个版本的程序得到了一些改进。更为重要的是我们再也不需要指定程序如何来回跳转了而是由while结构负责完成这个任务。只要我们给予的条件成立while语句就会不停地执行其下方的语句块包裹在大括号中。而我们给予的条件是count<=10意思是“count小于等于10”。我们再也不需要创建临时的值并将其与0比较那样的代码十分烦琐。编程语言的一项职责就是能够帮助我们处理这些烦琐无趣的逻辑。
这个版本的程序得到了一些改进。更为重要的是,我们再也不需要指定程序如何来回跳转了,而是由`while`结构负责完成这个任务。只要我们给予的条件成立,`while`语句就会不停地执行其下方的语句块(包裹在大括号中)。而我们给予的条件是`count<=10`,意思是“`count`小于等于 10”。我们再也不需要创建临时的值并将其与 0 比较,那样的代码十分烦琐。编程语言的一项职责就是,能够帮助我们处理这些烦琐无趣的逻辑。
在程序的结尾也就是while语句结束后我们使用console.log操作来输出结果。
在程序的结尾,也就是`while`语句结束后,我们使用`console.log`操作来输出结果。
最后我们恰好有range和sum这类方便的操作。下面代码中的range函数用于创建数字集合sum函数用于计算数字集合之和
最后,我们恰好有`range``sum`这类方便的操作。下面代码中的`range`函数用于创建数字集合,`sum`函数用于计算数字集合之和:
```js
console.log(sum(range(1, 10)));
// → 55
```
我们可以从这里了解到同一个程序的长度可长可短可读性可高可低。第一个版本的程序晦涩难懂而最后一个版本的程序则接近于人类语言的表达方式将1~10范围内的数字之和记录下来我们会在后面的章节中详细介绍如何编写sum和range这样的函数
我们可以从这里了解到,同一个程序的长度可长可短,可读性可高可低。第一个版本的程序晦涩难懂,而最后一个版本的程序则接近于人类语言的表达方式:将 1~10 范围内的数字之和记录下来(我们会在后面的章节中详细介绍如何编写`sum``range`这样的函数)。
优秀的编程语言可以为开发人员提供更高层次的抽象使用类似于人类语言的方式来与计算机进行交互。它有助于省略细节提供便捷的积木比如while和console.log允许你定义自己的积木比如sum和range函数并使这些积木易于编写。。
优秀的编程语言可以为开发人员提供更高层次的抽象,使用类似于人类语言的方式来与计算机进行交互。它有助于省略细节,提供便捷的积木(比如`while``console.log`),允许你定义自己的积木(比如`sum``range`函数),并使这些积木易于编写。。
## 什么是 JavaScript
@ -136,13 +150,13 @@ JavaScript其实和名为Java的程序设计语言没有任何关系。起了这
许多人会说 JavaScript 语言的坏话。这其中有很多这样的言论都是正确的。当被要求第一次使用 JavaScript 编写代码时我当时就觉得这门语言难以驾驭。JavaScript 接受我输入的任何代码,但是又使用和我的想法完全不同的方式来解释代码。由于我没有任何线索知道我之前做了什么,因此我需要做出更多工作,但这也就存在一个实际问题:我们可以自由使用 JavaScript而这种自由却几乎没有限度。这种设计其实是希望初学者更容易使用 JavaScript 编写程序。但实际上,系统不会指出我们错在何处,因此从程序中找出问题变得更加棘手。
但这种自由性也有其优势许多技术在更为严格的语言中不可能实现而在JavaScript中则留下了实现的余地正如你看到的那样比如第10章有些优势可以弥补JavaScript的一些缺点。在正确地学习JavaScript并使用它工作了一段时间后我真正喜欢上了JavaScript。
但这种自由性也有其优势,许多技术在更为严格的语言中不可能实现,而在 JavaScript 中则留下了实现的余地,正如你看到的那样(比如第十章),有些优势可以弥补 JavaScript 的一些缺点。在正确地学习 JavaScript 并使用它工作了一段时间后,我真正喜欢上了 JavaScript。
JavaScript版本众多。大约在2000~2010年间这正是JavaScript飞速发展的时期浏览器支持最多的是ECMAScript 3。在此期间ECMA着手制定ECMAScript 4这是一个雄心勃勃的版本ECMA计划在这个版本中加入许多彻底的改进与扩展。但由于ECMAScript 3被广泛使用这种过于激进的修改必然会遭遇重重阻碍最后ECMA不得不于2008年放弃了版本4的制定。这就产生了不那么理想的版本5这只是一些没有争议的改进出现在2009年。 然后版本6在2015年诞生这是一个重大的更新其中包括计划用于版本 4 的一些想法。 从那以后,每年都会有新的更新。
JavaScript 版本众多。大约在 2000~2010 年间,这正是 JavaScript 飞速发展的时期,浏览器支持最多的是 ECMAScript 3。在此期间ECMA 着手制定 ECMAScript 4这是一个雄心勃勃的版本ECMA 计划在这个版本中加入许多彻底的改进与扩展。但由于 ECMAScript 3 被广泛使用,这种过于激进的修改必然会遭遇重重阻碍,最后 ECMA 不得不于 2008 年放弃了版本 4 的制定。这就产生了不那么雄心勃勃的版本 5这只是一些没有争议的改进出现在 2009 年。 然后版本 6 2015 年诞生,这是一个重大的更新,其中包括计划用于版本 4 的一些想法。从那以后,每年都会有新的更新。
语言不断发展的事实意味着,浏览器必须不断跟上,如果你使用的是较老的浏览器,它可能不支持每个特性。 语言设计师会注意,不要做任何可能破坏现有程序的改变,所以新的浏览器仍然可以运行旧的程序。 在本书中,我使用的是 2017 版的 JavaScript。
Web浏览器并不是唯一一个可以运行JavaScript的平台。有些数据库比如MongoDB和CouchDB也使用JavaScript作为脚本语言和查询语言。一些桌面和服务器开发的平台特别是Node.js项目第20章介绍为浏览器以外的JavaScript编程提供了一个环境。
Web 浏览器并不是唯一一个可以运行 JavaScript 的平台。有些数据库,比如 MongoDB CouchDB也使用 JavaScript 作为脚本语言和查询语言。一些桌面和服务器开发的平台,特别是 Node.js 项目(第二十章介绍),为浏览器以外的 JavaScript 编程提供了一个环境。
## 代码及相关工作
@ -150,7 +164,7 @@ Web浏览器并不是唯一一个可以运行JavaScript的平台。有些数据
建议读者应尝试在实际的 JavaScript 解释器中执行习题代码。这样一来,你就可以马上获知代码工作情况的反馈,而且我希望读者去做更多的试验,而不仅仅局限于习题的要求。
可以在[http://eloquentjavascript.net/](http://eloquentjavascript.net/)中查阅本书的在线版本,并运行和实验本书中的代码。也可以在在线版本中点击任何代码示例来编辑、运行并查看其产生的输出。在做习题时,你可以访问[http://eloquentjavascript.net/code/](http://eloquentjavascript.net/code/),该网址会提供每个习题的初始代码,让你专心于解答习题。
可以在 <http://eloquentjavascript.net/> 中查阅本书的在线版本,并运行和实验本书中的代码。也可以在在线版本中点击任何代码示例来编辑、运行并查看其产生的输出。在做习题时,你可以访问 <http://eloquentjavascript.net/code/>,该网址会提供每个习题的初始代码,让你专心于解答习题。
如果想要在本书提供的沙箱以外执行本书代码,需要稍加注意。许多的示例是独立的,而且可以在任何 JavaScript 环境下运行。但后续章节的代码大多数都是为特定环境(浏览器或者 Node.js编写的而且只能在这些特定环境下执行代码。此外许多章节定义了更大的程序这些章节中出现的代码片段会互相依赖或是依赖于一些外部文件。本书网站的沙箱提供了 zip 压缩文件的链接,该文件包含了所有运行特定章节代码所需的脚本和数据文件。
@ -160,7 +174,7 @@ Web浏览器并不是唯一一个可以运行JavaScript的平台。有些数据
纵观本书,共有 5 个项目实战章用于讲解规模较大的示例程序你可以通过这些章来仔细品味真实的编程过程。根据项目出现次序我们会陆续构建递送机器人7、程序设计语言12、平台游戏16、像素绘图程序19和一个动态网站21
本书介绍编程语言时首先使用4章来介绍JavaScript语言的基本结构包括第二章控制结构比如在本前言中看到的while单词、第三章函数编写你自己的积木和第四章数据结构。此后你就可以编写简单的程序了。接下来第五章和第六章介绍函数和对象的运用技术以编写更加抽象的代码并以此来控制复杂度。
本书介绍编程语言时首先使用4章来介绍 JavaScript 语言的基本结构,包括第二章控制结构(比如在本前言中看到的`while`单词)、第三章函数(编写你自己的积木)和第四章数据结构。此后你就可以编写简单的程序了。接下来,第五章和第六章介绍函数和对象的运用技术,以编写更加抽象的代码并以此来控制复杂度。
介绍完第一个项目实战7之后将会继续讲解语言部分例如第八章错误处理和 bug 修复、第九章正则表达式处理文本数据的重要工具、第十章模块化解决复杂度的问题以及第十一章异步编程处理需要时间的事件。第二个项目实战章节12则是对本书第一部分的总结。
@ -188,3 +202,5 @@ function factorial(n) {
console.log(factorial(8));
// → 40320
```
祝好运!

BIN
img/0-0.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB