1
0
mirror of https://github.com/apachecn/eloquent-js-3e-zh.git synced 2025-05-24 04:22:20 +00:00
This commit is contained in:
wizardforcel 2018-04-30 14:28:45 +08:00
parent 99955cf662
commit 7c08545385

66
2.md
View File

@ -30,7 +30,7 @@
最简单的一条语句由一个表达式和其后的分号组成。比如这就是一个程序: 最简单的一条语句由一个表达式和其后的分号组成。比如这就是一个程序:
``` ```js
1; 1;
!false; !false;
``` ```
@ -43,7 +43,7 @@
程序如何保持内部状态? 它如何记住东西? 我们已经看到如何从旧值中产生新值,但这并没有改变旧值,新值必须立即使用,否则将会再度消失。 为了捕获和保存值JavaScript 提供了一种称为绑定或变量的东西: 程序如何保持内部状态? 它如何记住东西? 我们已经看到如何从旧值中产生新值,但这并没有改变旧值,新值必须立即使用,否则将会再度消失。 为了捕获和保存值JavaScript 提供了一种称为绑定或变量的东西:
``` ```js
let caught = 5 * 5; let caught = 5 * 5;
``` ```
@ -53,7 +53,7 @@ let caught = 5 * 5;
在定义绑定之后,它的名称可以用作表达式。 这种表达式的值是绑定当前所持有的值。 这是一个例子: 在定义绑定之后,它的名称可以用作表达式。 这种表达式的值是绑定当前所持有的值。 这是一个例子:
``` ```js
let ten = 10; let ten = 10;
console.log(ten * ten); console.log(ten * ten);
// → 100 // → 100
@ -61,7 +61,7 @@ console.log(ten * ten);
当绑定指向某个值时,并不意味着它永远与该值绑定。 可以在现有的绑定上随时使用`=`运算符,将它们与当前值断开连接,并让它们指向一个新值: 当绑定指向某个值时,并不意味着它永远与该值绑定。 可以在现有的绑定上随时使用`=`运算符,将它们与当前值断开连接,并让它们指向一个新值:
``` ```js
var mood = "light"; var mood = "light";
console.log(mood); console.log(mood);
// → light // → light
@ -74,7 +74,7 @@ console.log(mood);
我们来看另一个例子。 为了记住 Luigi 欠你的美元数量,你需要创建一个绑定。 然后当他还你 35 美元时,你赋予这个绑定一个新值: 我们来看另一个例子。 为了记住 Luigi 欠你的美元数量,你需要创建一个绑定。 然后当他还你 35 美元时,你赋予这个绑定一个新值:
``` ```js
let luigisDebt = 140; let luigisDebt = 140;
luigisDebt = luigisDebt - 35; luigisDebt = luigisDebt - 35;
console.log(luigisDebt); console.log(luigisDebt);
@ -85,7 +85,7 @@ console.log(luigisDebt);
一个`let`语句可以同时定义多个绑定,定义必需用逗号分隔。 一个`let`语句可以同时定义多个绑定,定义必需用逗号分隔。
``` ```js
let one = 1, two = 2; let one = 1, two = 2;
console.log(one + two); console.log(one + two);
// → 3 // → 3
@ -93,7 +93,7 @@ console.log(one + two);
`var``const`这两个词也可以用来创建绑定,类似于`let` `var``const`这两个词也可以用来创建绑定,类似于`let`
``` ```js
var name = "Ayda"; var name = "Ayda";
const greeting = "Hello "; const greeting = "Hello ";
console.log(greeting + name); console.log(greeting + name);
@ -128,7 +128,7 @@ switch this throw true try typeof var void while with yield
在默认环境中提供的许多值的类型为函数。 函数是包裹在值中的程序片段。 为了运行包裹的程序,可以将这些值应用于它们。 例如,在浏览器环境中,绑定`prompt`包含一函数,个显示一个小对话框,请求用户输入。 它是这样使用的: 在默认环境中提供的许多值的类型为函数。 函数是包裹在值中的程序片段。 为了运行包裹的程序,可以将这些值应用于它们。 例如,在浏览器环境中,绑定`prompt`包含一函数,个显示一个小对话框,请求用户输入。 它是这样使用的:
``` ```js
prompt("Enter passcode"); prompt("Enter passcode");
``` ```
@ -144,7 +144,7 @@ prompt("Enter passcode");
> 在英文版页面上运行示例(或自己的代码)时,会在示例之后显示`console.log`输出,而不是在浏览器的 JavaScript 控制台中显示。 > 在英文版页面上运行示例(或自己的代码)时,会在示例之后显示`console.log`输出,而不是在浏览器的 JavaScript 控制台中显示。
``` ```js
let x = 30; let x = 30;
console.log("the value of x is", x); console.log("the value of x is", x);
// → the value of x is 30 // → the value of x is 30
@ -156,14 +156,14 @@ console.log("the value of x is", x);
显示对话框或将文字写入屏幕是一个副作用。 由于它们产生的副作用,很多函数都很有用。 函数也可能产生值,在这种情况下,他们不需要有副作用就有用。 例如,函数`Math.max`可以接受任意数量的参数并返回最大值。 显示对话框或将文字写入屏幕是一个副作用。 由于它们产生的副作用,很多函数都很有用。 函数也可能产生值,在这种情况下,他们不需要有副作用就有用。 例如,函数`Math.max`可以接受任意数量的参数并返回最大值。
``` ```js
console.log(Math.max(2, 4)); console.log(Math.max(2, 4));
// → 4 // → 4
``` ```
当一个函数产生一个值时,它被称为返回该值。 任何产生值的东西都是 JavaScript 中的表达式,这意味着可以在较大的表达式中使用函数调用。 在这里,`Math.min`的调用(与`Math.max`相反)用作加法表达式的一部分: 当一个函数产生一个值时,它被称为返回该值。 任何产生值的东西都是 JavaScript 中的表达式,这意味着可以在较大的表达式中使用函数调用。 在这里,`Math.min`的调用(与`Math.max`相反)用作加法表达式的一部分:
``` ```js
console.log(Math.min(2, 4) + 100); console.log(Math.min(2, 4) + 100);
// → 102 // → 102
``` ```
@ -174,7 +174,7 @@ console.log(Math.min(2, 4) + 100);
当你的程序包含多个语句时,这些语句就像是一个故事一样从上到下执行。 这个示例程序有两个语句。 第一个要求用户输入一个数字,第二个在第一个之后执行,显示该数字的平方。 当你的程序包含多个语句时,这些语句就像是一个故事一样从上到下执行。 这个示例程序有两个语句。 第一个要求用户输入一个数字,第二个在第一个之后执行,显示该数字的平方。
``` ```js
let theNumber = Number(prompt("Pick a number")); let theNumber = Number(prompt("Pick a number"));
console.log("Your number is the square root of " + console.log("Your number is the square root of " +
theNumber * theNumber); theNumber * theNumber);
@ -195,7 +195,7 @@ console.log("Your number is the square root of " +
在 JavaScript 中,条件执行使用`if`关键字创建。 在简单的情况下,当且仅当某些条件成立时,我们才希望执行一些代码。 例如,仅当输入实际上是一个数字时,我们可能打算显示输入的平方。 在 JavaScript 中,条件执行使用`if`关键字创建。 在简单的情况下,当且仅当某些条件成立时,我们才希望执行一些代码。 例如,仅当输入实际上是一个数字时,我们可能打算显示输入的平方。
``` ```js
let theNumber = Number(prompt("Pick a number", "")); let theNumber = Number(prompt("Pick a number", ""));
if (!isNaN(theNumber)) if (!isNaN(theNumber))
alert("Your number is the square root of " + alert("Your number is the square root of " +
@ -211,14 +211,14 @@ if (!isNaN(theNumber))
在这个例子中,`if`下面的语句被大括号(`{``}`)括起来。 它们可用于将任意数量的语句分组到单个语句中,称为代码块。 在这种情况下,你也可以忽略它们,因为它们只包含一个语句,但为了避免必须考虑是否需要,大多数 JavaScript 程 序员在每个这样的被包裹的语句中使用它们。 除了偶尔的一行,我们在本书中大多会遵循这个约定。 在这个例子中,`if`下面的语句被大括号(`{``}`)括起来。 它们可用于将任意数量的语句分组到单个语句中,称为代码块。 在这种情况下,你也可以忽略它们,因为它们只包含一个语句,但为了避免必须考虑是否需要,大多数 JavaScript 程 序员在每个这样的被包裹的语句中使用它们。 除了偶尔的一行,我们在本书中大多会遵循这个约定。
``` ```js
if (1 + 1 == 2) console.log("It's true"); if (1 + 1 == 2) console.log("It's true");
// → It's true // → It's true
``` ```
您通常不会只执行条件成立时代码,还会处理其他情况的代码。 该替代路径由图中的第二个箭头表示。 可以一起使用`if``else`关键字,创建两个单独的替代执行路径。 您通常不会只执行条件成立时代码,还会处理其他情况的代码。 该替代路径由图中的第二个箭头表示。 可以一起使用`if``else`关键字,创建两个单独的替代执行路径。
```py ```js
let theNumber = Number(prompt("Pick a number")); let theNumber = Number(prompt("Pick a number"));
if (!Number.isNaN(theNumber)) { if (!Number.isNaN(theNumber)) {
console.log("Your number is the square root of " + console.log("Your number is the square root of " +
@ -230,7 +230,7 @@ if (!Number.isNaN(theNumber)) {
如果我们需要执行的路径多于两条,可以将多个`if/else`对链接在一起使用。如下所示例子: 如果我们需要执行的路径多于两条,可以将多个`if/else`对链接在一起使用。如下所示例子:
``` ```js
let num = Number(prompt("Pick a number", "0")); let num = Number(prompt("Pick a number", "0"));
if (num < 10) { if (num < 10) {
@ -252,7 +252,7 @@ if (num < 10) {
现考虑编写一个程序,输出 0 到 12 之间的所有偶数。其中一种编写方式如下所示: 现考虑编写一个程序,输出 0 到 12 之间的所有偶数。其中一种编写方式如下所示:
``` ```js
console.log(0); console.log(0);
console.log(2); console.log(2);
console.log(4); console.log(4);
@ -268,7 +268,7 @@ console.log(12);
我们可以使用循环控制流来让程序执行回到之前的某个位置,并根据程序状态循环执行代码。如果我们在循环中使用一个绑定计数,那么就可以按照如下方式编写代码: 我们可以使用循环控制流来让程序执行回到之前的某个位置,并根据程序状态循环执行代码。如果我们在循环中使用一个绑定计数,那么就可以按照如下方式编写代码:
``` ```js
let number = 0; let number = 0;
while (number <= 12) { while (number <= 12) {
console.log(number); console.log(number);
@ -286,7 +286,7 @@ while (number <= 12) {
作为一个实际上有用的例子,现在我们可以编写一个程序来计算并显示`2**10`2 的 10 次方)的结果。 我们使用两个绑定:一个用于跟踪我们的结果,一个用来计算我们将这个结果乘以 2 的次数。 该循环测试第二个绑定是否已达到 10如果不是则更新这两个绑定。 作为一个实际上有用的例子,现在我们可以编写一个程序来计算并显示`2**10`2 的 10 次方)的结果。 我们使用两个绑定:一个用于跟踪我们的结果,一个用来计算我们将这个结果乘以 2 的次数。 该循环测试第二个绑定是否已达到 10如果不是则更新这两个绑定。
``` ```js
let result = 1; let result = 1;
let counter = 0; let counter = 0;
while (counter < 10) { while (counter < 10) {
@ -301,7 +301,7 @@ console.log(result);
`do`循环控制结构类似于`while`循环。两者之间只有一个区别:`do`循环至少执行一遍循环体,只有第一次执行完循环体之后才会开始检测循环条件。`do`循环中将条件检测放在循环体后面,正反映了这一点: `do`循环控制结构类似于`while`循环。两者之间只有一个区别:`do`循环至少执行一遍循环体,只有第一次执行完循环体之后才会开始检测循环条件。`do`循环中将条件检测放在循环体后面,正反映了这一点:
``` ```js
let yourName; let yourName;
do { do {
yourName = prompt("Who are you?"); yourName = prompt("Who are you?");
@ -317,7 +317,7 @@ console.log(yourName);
块内缩进的作用是使代码结构显而易见。 在其他块内开启新的代码块中,可能很难看到块的结束位置,和另一个块开始位置。 通过适当的缩进,程序的视觉形状对应其内部块的形状。 我喜欢为每个开启的块使用两个空格,但风格不同 - 有些人使用四个空格,而有些人使用制表符。 重要的是,每个新块添加相同的空格量。 块内缩进的作用是使代码结构显而易见。 在其他块内开启新的代码块中,可能很难看到块的结束位置,和另一个块开始位置。 通过适当的缩进,程序的视觉形状对应其内部块的形状。 我喜欢为每个开启的块使用两个空格,但风格不同 - 有些人使用四个空格,而有些人使用制表符。 重要的是,每个新块添加相同的空格量。
``` ```js
if (false != true) { if (false != true) {
console.log("That makes sense."); console.log("That makes sense.");
if (1 < 2) { if (1 < 2) {
@ -334,7 +334,7 @@ if (false != true) {
由于这种规律非常常见JavaScript 和类似的语言提供了一个稍短而且更全面的形式,`for`循环: 由于这种规律非常常见JavaScript 和类似的语言提供了一个稍短而且更全面的形式,`for`循环:
``` ```js
for (let number = 0; number <= 12; number = number + 2) for (let number = 0; number <= 12; number = number + 2)
console.log(number); console.log(number);
// → 0 // → 0
@ -348,7 +348,7 @@ for (let number = 0; number <= 12; number = number + 2)
下面的代码中使用了`for`循环代替`while`循环,来计算`2**10` 下面的代码中使用了`for`循环代替`while`循环,来计算`2**10`
``` ```js
var result = 1; var result = 1;
for (var counter = 0; counter < 10; counter = counter + 1) for (var counter = 0; counter < 10; counter = counter + 1)
result = result * 2; result = result * 2;
@ -362,7 +362,7 @@ console.log(result);
下面的程序展示了`break`语句的用法。该程序的作用是找出第一个大于等于 20 且能被 7 整除的数字。 下面的程序展示了`break`语句的用法。该程序的作用是找出第一个大于等于 20 且能被 7 整除的数字。
``` ```js
for (let current = 20; ; current++) { for (let current = 20; ; current++) {
if (current % 7 == 0) if (current % 7 == 0)
break; break;
@ -385,13 +385,13 @@ for (let current = 20; ; current++) {
程序经常需要根据绑定的原值进行计算并更新值,特别是在循环过程中,这种情况更加常见。 程序经常需要根据绑定的原值进行计算并更新值,特别是在循环过程中,这种情况更加常见。
``` ```js
counter = counter + 1; counter = counter + 1;
``` ```
JavaScript 提供了一种简便写法: JavaScript 提供了一种简便写法:
``` ```js
counter += 1; counter += 1;
``` ```
@ -399,7 +399,7 @@ JavaScript 还为其他运算符提供了类似的简便方法,比如`result*=
这样可以稍微简化我们的计数示例代码。 这样可以稍微简化我们的计数示例代码。
``` ```js
for (let number = 0; number <= 12; number += 2) for (let number = 0; number <= 12; number += 2)
console.log(number); console.log(number);
``` ```
@ -410,7 +410,7 @@ for (let number = 0; number <= 12; number += 2)
我们很少会编写如下所示的代码。 我们很少会编写如下所示的代码。
``` ```js
if (x == "value1") action1(); if (x == "value1") action1();
else if (x == "value2") action2(); else if (x == "value2") action2();
else if (x == "value3") action3(); else if (x == "value3") action3();
@ -419,7 +419,7 @@ else defaultAction();
有一种名为`switch`的结构,为了以更直接的方式表达这种“分发”。 不幸的是JavaScript 为此所使用的语法(它从 C/Java 语言中继承而来)有些笨拙 - `if`语句链看起来可能更好。 这里是一个例子: 有一种名为`switch`的结构,为了以更直接的方式表达这种“分发”。 不幸的是JavaScript 为此所使用的语法(它从 C/Java 语言中继承而来)有些笨拙 - `if`语句链看起来可能更好。 这里是一个例子:
``` ```js
switch (prompt("What is the weather like?")) { switch (prompt("What is the weather like?")) {
case "rainy": case "rainy":
console.log("Remember to bring an umbrella."); console.log("Remember to bring an umbrella.");
@ -441,7 +441,7 @@ switch (prompt("What is the weather like?")) {
绑定名中不能包含空格,但很多时候使用多个单词有助于清晰表达绑定的实际用途。当绑定名中包含多个单词时可以选择多种写法,以下是可以选择的几种绑定名书写方式: 绑定名中不能包含空格,但很多时候使用多个单词有助于清晰表达绑定的实际用途。当绑定名中包含多个单词时可以选择多种写法,以下是可以选择的几种绑定名书写方式:
``` ```js
fuzzylittleturtle fuzzylittleturtle
fuzzy_little_turtle fuzzy_little_turtle
FuzzyLittleTurtle FuzzyLittleTurtle
@ -458,7 +458,7 @@ fuzzyLittleTurtle
注释是程序中的一段文本而在程序执行时计算机会完全忽略掉这些文本。JavaScript 中编写注释有两种方法,写单行注释时,使用两个斜杠字符开头,并在后面添加文本注释。 注释是程序中的一段文本而在程序执行时计算机会完全忽略掉这些文本。JavaScript 中编写注释有两种方法,写单行注释时,使用两个斜杠字符开头,并在后面添加文本注释。
``` ```js
let accountBalance = calculateBalance(account); let accountBalance = calculateBalance(account);
// It's a green hollow where a river sings // It's a green hollow where a river sings
accountBalance.adjust(); accountBalance.adjust();
@ -471,7 +471,7 @@ addToReport(accountBalance, report);
`//`注释只能到达行尾。 `/*``*/`之间的一段文本将被忽略,不管它是否包含换行符。 这对添加文件或程序块的信息块很有用。 `//`注释只能到达行尾。 `/*``*/`之间的一段文本将被忽略,不管它是否包含换行符。 这对添加文件或程序块的信息块很有用。
``` ```js
/* /*
I first found this number scrawled on the back of one of I first found this number scrawled on the back of one of
an old notebook. Since then, it has often dropped by, an old notebook. Since then, it has often dropped by,
@ -514,7 +514,7 @@ const myNumber = 11213;
这里给出一个小技巧,在字符串后加上`.length`可以获取字符串的长度。 这里给出一个小技巧,在字符串后加上`.length`可以获取字符串的长度。
``` ```js
let abc = "abc"; let abc = "abc";
console.log(abc.length); console.log(abc.length);
// → 3 // → 3