Skip to content

Commit

Permalink
progress
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhou, Ding a committed Nov 17, 2016
1 parent b430e8d commit 4749196
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 82 deletions.
31 changes: 15 additions & 16 deletions es6 & beyond/ch5.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

结构化的集合与数据访问对于任何JS程序来说都是一个关键组成部分。从这门语言的最开始到现在,数组和对象一直都是我们创建数据结构的主要机制。当然,许多更高级的数据结构作为用户方的库都曾建立在这些之上。

到了ES6,最有用(而且性能经过优化的!)的数据结构抽象中的一些已经作为这门语言的原生组件被加入了进来。
到了ES6,最有用(而且优化性能的!)的数据结构抽象中的一些已经作为这门语言的原生组件被加入了进来。

我们将通过检视 *类型化数组(TypedArrays)* 来开始这一章,技术上讲它与几年前的ES5是同一时期的产物,但是仅仅作为WebGL的同伴被标准化了,而不是作为JavaScript自身的一部分。到了ES6,这些东西已经被语言规范直接采纳了,这给予了它们头等的地位。

Expand Down Expand Up @@ -276,7 +276,7 @@ m.size; // 0
```js
var m2 = new Map( m.entries() );

// same as:
// 等同于:
var m2 = new Map( m );
```

Expand All @@ -297,9 +297,9 @@ m.get( x ); // "foo"
m.get( y ); // "bar"
```

### Map Values
### Map

要从一个map得到值的列表,使用`values(..)`,它返回一个迭代器。在第二和第三章,我们讲解了几种序列化处理一个迭代器的方法,比如`...`扩散操作符和`for..of`循环。另外,第六章的“Arrays”将会详细讲解`Array.from(..)`方法。考虑如下代码:
要从一个map得到值的列表,使用`values(..)`,它返回一个迭代器。在第二和第三章,我们讲解了几种序列化(像一个数组那样)处理一个迭代器的方法,比如`...`扩散操作符和`for..of`循环。另外,第六章的“Arrays”将会详细讲解`Array.from(..)`方法。考虑如下代码:

```js
var m = new Map();
Expand Down Expand Up @@ -336,7 +336,7 @@ vals[1][0] === y; // true
vals[1][1]; // "bar"
```

### Map Keys
### Map

要得到键的列表,使用`keys()`,它返回一个map中键的迭代器:

Expand Down Expand Up @@ -395,11 +395,11 @@ m.has( x ); // true
m.has( y ); // false
```

WeakMap没有`size`属性和`clear()`方法,它们也不对它们的键,值和记录暴露任何迭代器。所以即便你解除了`x`引用,它将会从`m`中移除它的记录到GC,也没有办法确定这一事实。你只能相信JavaScript会这么做!
WeakMap没有`size`属性和`clear()`方法,它们也不对它们的键,值和记录暴露任何迭代器。所以即便你解除了`x`引用,它将会因GC从`m`中移除它的记录,也没有办法确定这一事实。你只能相信JavaScript会这么做!

就像map一样,WeakMap让你将信息与一个对象软关联。如果你不能完全控制这个对象,比如DOM元素,它们就特别有用。如果你用做map键的对象可以被删除并且应当在被删除时成为GC的回收对象,那么一个WeakMap就是更合适的选项。

要注意的是WeakMap只若持有它的 **,而不是它的值。考虑如下代码:
要注意的是WeakMap只弱持有它的 **,而不是它的值。考虑如下代码:

```js
var m = new WeakMap();
Expand All @@ -411,13 +411,12 @@ var x = { id: 1 },

m.set( x, y );

x = null; // { id: 1 } is GC-eligible
y = null; // { id: 2 } is GC-eligible
// only because { id: 1 } is
x = null; // { id: 1 } 是可以GC的
y = null; // 由于 { id: 1 } 是可以GC的,因此 { id: 2 } 也可以

m.set( z, w );

w = null; // { id: 4 } is not GC-eligible
w = null; // { id: 4 } 不可以GC
```

因此,我认为WeakMap被命名为“WeakKeyMap”更好。
Expand Down Expand Up @@ -474,7 +473,7 @@ s.has( y ); // false

**注意:** `has(..)`中的比较算法与`Object.is(..)`(见第六章)几乎完全相同,除了`-0``0`被视为相同而非不同。

### Set Iterators
### Set 迭代器

set和map一样拥有相同的迭代器方法。set的行为有所不同,但是与map的迭代器的行为是对称的。考虑如下代码:

Expand Down Expand Up @@ -528,17 +527,17 @@ var x = { id: 1 },
s.add( x );
s.add( y );

x = null; // `x` is GC-eligible
y = null; // `y` is GC-eligible
x = null; // `x` 可以GC
y = null; // `y` 可以GC
```

**警告:** WeakSet的值必须是对象,在set中被允许的基本类型值是不行的。

## Review
## 复习

ES6定义了几种有用的集合,它们使得处理解构化的数据更加高效和有效。

TypedArray提供了二进制数据缓冲的“视图”,它使用各种整数类型对其,比如8位无符号整数和32位浮点数。二进制数据的数组访问使得操作更加容易表达和维护,它可以让你更简单地处理如视频,音频,canvas数据等复杂的数组。
类型化数组提供了二进制数据缓冲的“视图”,它使用各种整数类型对齐,比如8位无符号整数和32位浮点数。二进制数据的数组访问使得操作更加容易表达和维护,它可以让你更简单地处理如视频,音频,canvas数据等复杂的数组。

Map是键-值对集合,它的键可以是对象而非只可以是字符串/基本类型。Set是(任何类型的)唯一值的列表。

Expand Down
Loading

0 comments on commit 4749196

Please sign in to comment.