Skip to content

Commit a61062a

Browse files
coffe1891gitbook-bot
authored andcommitted
GitBook: [master] 2 pages modified
1 parent 4c6d4fd commit a61062a

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

1/1.1.1.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# 壹.1.1 新版 ECMAScript 特性分析
22

33
{% hint style="info" %}
4-
本书约定: 示例代码中注释里双右尖括号 `>>` 代表“打印/输出”的意思。
4+
本书约定: 示例代码中注释里双右尖括号 `>>` 代表“打印/输出”的意思。
55
{% endhint %}
66

77
## 壹.1.1.0 本篇导读
@@ -20,7 +20,7 @@ JavaScript起源于1995年Netscape为自家游览器创造的脚本语言LiveScr
2020

2121
在2009年12月诞生了ES 5。你可能会问ES 4 呢,抱歉,版本4因为太激进,EI委员会成员之间的意见不一,最后胎死腹中,改由更加平滑温和的版本5继承版本4的一些新特性和功能。
2222

23-
EI于2015年6月发布了ES 6,也就是我们今天广泛使用的版本。这之后每年6月发布一个极小更新的ES版本,比如2016年6月发布的 ES 2016 叫做ES 7,而这个版本只增加了两个新特性。截止本书编写时,ES 11的提案已经定稿了。
23+
EI于2015年6月发布了ES 6,也就是我们今天广泛使用的版本。这之后每年6月发布一个极小更新的ES版本,比如2016年6月发布的 ES 2016 叫做ES 7,而这个版本只增加了两个新特性。截止本书编写时,ES 11的提案已经定稿了。
2424

2525
综上可见,**JavaScript是ECMAScript规范的一种实现**。为方便读者理解交流,而且由于ECAMScript 6 之后变化并不是特别大,如果没有特别说明,本书后面讲述的JavaScript对应的规范默认为 ES 6。
2626

@@ -129,7 +129,7 @@ Object.entries('es8'); // [['0', 'e'], ['1', 's'], ['2', '8']]
129129

130130
在 ES 8 中String新增了两个实例函数`String.prototype.padStart``String.prototype.padEnd`,允许将空字符串或其他字符串添加到原始字符串的开头或结尾。
131131

132-
* `String.padStart(targetLength,[padString])`
132+
* `String.padStart(targetLength,[padString])`
133133
_targetLength:_当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。
134134

135135
_padString:_\(可选\)填充字符串。如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断,此参数的缺省值为空格。
@@ -328,7 +328,6 @@ SharedArrayBuffer 对象用来表示一个通用的,固定长度的原始二
328328
* @returns {SharedArrayBuffer} 一个大小指定的新 SharedArrayBuffer 对象。其内容被初始化为 0。
329329
*/
330330
new SharedArrayBuffer(length)
331-
332331
```
333332

334333
Atomics 对象提供了一组静态方法用来对 SharedArrayBuffer 对象进行原子操作,这些原子操作属于 Atomics 模块。Atomics 不是构造函数,因此不能使用 new 操作符调用,也不能将其当作函数直接调用。Atomics 的所有属性和方法都是静态的(与 Math 对象一样)。
@@ -530,7 +529,7 @@ console.log(match2[0]); //>> $
530529
> \(**?!pattern\)** 零宽负向先行断言\(zero-width negative lookahead assertion\)
531530
> 代表字符串中的一个位置,**紧接该位置之后**的字符序列**不能匹配**pattern;
532531
>
533-
> **\(?<=pattern\)** 零宽正向后行断言\(zero-width positive lookbehind assertion\)
532+
> **\(?<=pattern\)** 零宽正向后行断言\(zero-width positive lookbehind assertion\)
534533
> 代表字符串中的一个位置,**紧接该位置之前**的字符序列**能够匹配**pattern;
535534
>
536535
> **\(?<!pattern\)** 零宽负向后行断言\(zero-width negative lookbehind assertion\)
@@ -676,7 +675,7 @@ ES10 之前,当你使用 `JSON.stringify()` 处理无法用 UTF-8 编码表示
676675
let r;
677676
r = JSON.stringify(""); //正常的UTF-8字符原样输出
678677
console.log(r); //>> "❤"
679-
678+
680679
r = JSON.stringify('\u2764'); //正常的UTF-8字符编码,输出解码之后的模样
681680
console.log(r); //>> "❤"
682681

5/5.2.1.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
而把程序的运算部分独立出来,既可以使用函数式编程,又可以使用命令式编程来实现。
1414

15-
笔者对命令式编程(面向对象编程主要为命令式编程)比较熟悉,也对函数式编程有所实践,综合考虑之后,认为函数式编程实现程序的运算部分会更好一些
15+
笔者对命令式编程(面向对象编程主要为命令式编程)比较熟悉,也对函数式编程有所实践,综合考虑之后,认为函数式编程实现程序的运算部分会更畅快一些
1616

1717
## 02.函数式编程的定义
1818

@@ -44,20 +44,20 @@ for(let i=0;i<studentsWeight.length;i++){
4444
console.log(sum);//>> 261
4545
```
4646

47-
通过一个for循环,然后引入临时变量studentsWeigth和sum,让sum与每个学生体重相加,最后打印结果。这就是典型的命令式编程,你要做什么事情,得把达到目的的步骤详细的描述出来,然后交给机器去运行。在这个过程中,引入了临时变量studentsWeigth和sum,并且for循环一次,sum的值便被改变一次,并且进行一个打印结果的操作,这些都是**副作用**
47+
通过一个for循环,然后引入临时变量studentsWeigth和sum,让sum与每个学生体重相加,最后打印结果。这就是典型的命令式编程,你要做什么事情,得把达到目的的步骤详细的描述出来,然后交给机器去运行。在这个过程中,引入了临时变量studentsWeigth和sum,并且for循环一次,sum的值便被改变一次,这些都是**副作用**
4848

4949
那么,不用这种方式,函数式编程会如何做呢?如下:
5050

5151
```javascript
52-
[49,50,43,55,64].reduce((a,b)=>a+b);//>> 261
52+
console.log([49,50,43,55,64].reduce((a,b)=>a+b));//>> 261
5353
```
5454

5555
哇,惊人的简洁清爽!上面的这段代码主要表达要实现什么(调用`reduce`函数求和),而不是在描述具体的实现的步骤,也没有循环的代码。具体的细节已经封装到`reduce`函数里面,我们看不到也暂时不用关心。这样就可以把程序员注意力从程序的步骤控制、变量的维护等繁琐的事情中解放出来,去专注于要实现什么。而且中间没有副作用。
5656

5757
> 关于“副作用”的更多阐释,引用自《Java函数式编程》:
5858
>
5959
> 当我说“没有副作用”的时候,我是指没有可观测到的副作用。函数式的程序是由接收参数并返回值的函数复合而成的,仅此而已。你并不关心函数内部发生了什么……但是在实际上,程序是为完全非函数式的计算机而编写的。所有的计算机都基于相同的命令式范式,所以函数就是如下黑盒:
60-
> 接收一个参数(一个单独的参数)
60+
> 接收一个(单独的)参数
6161
> ■ 内部做一些神秘的事情,例如改变变量的值,还有许多命令式风格的东西,但是在外界来看并没有什么东西。
6262
> ■ 返回一个(单独的)值。
6363
> 这只是理论。实际上,函数不可能完全没有副作用。函数会在某个时候返回一个值,而这个值可能是变化的。这就是一个副作用。它可能会造成一个内存耗尽的错误,或者是堆栈溢出的错误,导致应用程序崩溃,这在某种意义上就是一个可观测到的副作用。并且它还会造成写内存、寄存器变化、加载线程、上下文切换和其他确实会影响外界观测的这类事情。

0 commit comments

Comments
 (0)