@@ -197,7 +197,7 @@ for (let item of arrayLike) {}
197197
198198## Array.from
199199
200- 有一个全局方法 [ Array.from] ( mdn:js/Array/from ) 可以把它们全都结合起来。它以一个可迭代对象或者类数组对象作为参数并返回一个真正的 ` Array ` 数组。然后我们就可以用该对象调用数组的方法了 。
200+ 有一个全局方法 [ Array.from] ( mdn:js/Array/from ) 可以可以接受一个可迭代或类数组的值,并从中获取一个“真实的” 数组。然后我们就可以对其调用数组方法了 。
201201
202202例如:
203203
@@ -211,25 +211,25 @@ let arrayLike = {
211211* ! *
212212let arr = Array .from (arrayLike); // (*)
213213*/ ! *
214- alert (arr .pop ()); // World(pop 方法生效 )
214+ alert (arr .pop ()); // World(pop 方法有效 )
215215```
216216
217- 在行 ` (*) ` , ` Array.from ` 方法以一个对象为参数,检测到它是一个可迭代对象或类数组对象,然后将它转化为一个新的数组并将所有元素拷贝进去 。
217+ 在 ` (*) ` 行的 ` Array.from ` 方法接受对象,检测它是一个可迭代对象或类数组对象,然后创建一个新数组,并将该对象的所有元素复制到这个新数组 。
218218
219219如果是可迭代对象,也是同样:
220220
221221``` js
222- // 假设 range 来自上文例子中
222+ // 假设 range 来自上文的例子中
223223let arr = Array .from (range);
224- alert (arr); // 1,2,3,4,5 (数组的 toString 转化函数生效 )
224+ alert (arr); // 1,2,3,4,5 (数组的 toString 转化方法生效 )
225225```
226226
227227` Array.from ` 的完整语法允许提供一个可选的 "mapping"(映射)函数:
228228``` js
229229Array .from (obj[, mapFn, thisArg])
230230```
231231
232- 第二个参数 ` mapFn ` 应是一个在元素被添加到数组前,施加于每个元素的方法, ` thisArg ` 允许设置方法的 ` this ` 对象 。
232+ 可选的第二个参数 ` mapFn ` 可以是一个函数,该函数会在对象中的元素被添加到数组前,被应用于每个元素,此外 ` thisArg ` 允许为该函数设置 ` this ` 。
233233
234234例如:
235235
@@ -242,7 +242,7 @@ let arr = Array.from(range, num => num * num);
242242alert (arr); // 1,4,9,16,25
243243```
244244
245- 现在我们用 ` Array.from ` 将一个字符串转化为单个字符的数组 :
245+ 现在我们用 ` Array.from ` 将一个字符串转换为单个字符的数组 :
246246
247247``` js run
248248let str = ' 𝒳😂' ;
@@ -255,24 +255,24 @@ alert(chars[1]); // 😂
255255alert (chars .length ); // 2
256256```
257257
258- 不像 ` str.split ` 方法,上文的方法依赖于字符串的可迭代特性,所以就像 ` for..of ` 一样,能正确的处理 UTF-16 扩展字符。
258+ 与 ` str.split ` 方法不同,它依赖于字符串的可迭代特性。因此,就像 ` for..of ` 一样,可以正确地处理代理对(surrogate pair)。(译注:代理对也就是 UTF-16 扩展字符。)
259259
260260技术上来说,它和下文做了同样的事:
261261
262262``` js run
263263let str = ' 𝒳😂' ;
264264
265- let chars = []; // Array.from 内部完成了同样的循环
265+ let chars = []; // Array.from 内部执行相同的循环
266266for (let char of str) {
267267 chars .push (char);
268268}
269269
270270alert (chars);
271271```
272272
273- ...但是精简很多 。
273+ ……但 ` Array.from ` 精简很多 。
274274
275- 我们甚至可以基于 ` Array.from ` 创建能处理 UTF-16 扩展字符的 ` slice ` 方法:
275+ 我们甚至可以基于 ` Array.from ` 创建代理感知(surrogate-aware)的 ` slice ` 方法(译注:也就是能够处理 UTF-16 扩展字符的 ` slice ` 方法) :
276276
277277``` js run
278278function slice (str , start , end ) {
@@ -283,25 +283,25 @@ let str = '𝒳😂𩷶';
283283
284284alert ( slice (str, 1 , 3 ) ); // 😂𩷶
285285
286- // 原生方法不支持识别 UTF-16 扩展字符
286+ // 原生方法不支持识别代理对(译注: UTF-16 扩展字符)
287287alert ( str .slice (1 , 3 ) ); // 乱码(两个不同 UTF-16 扩展字符碎片拼接的结果)
288288```
289289
290290
291291## 总结
292292
293- 可以应用 ` for..of ` 的对象被称为** 可迭代的** 。
293+ 可以应用 ` for..of ` 的对象被称为 ** 可迭代的** 。
294294
295- - 技术上来说,可迭代对象必须实现方法 ` Symbol.iterator ` 。
296- - ` obj[Symbol.iterator] ` 的结果被称为** 迭代器** 。由它处理更深入的迭代过程 。
297- - 一个迭代器必须有 ` next() ` 方法,它返回一个 ` {done: Boolean, value: any} ` ,这里 ` done:true ` 表明迭代结束,否则 ` value ` 就是下一个值。
298- - ` Symbol.iterator ` 方法会被 ` for..of ` 自动调用,但我们也可以直接调用 。
295+ - 技术上来说,可迭代对象必须实现 ` Symbol.iterator ` 方法 。
296+ - ` obj[Symbol.iterator] ` 的结果被称为 ** 迭代器(iterator) ** 。由它处理进一步的迭代过程 。
297+ - 一个迭代器必须有 ` next() ` 方法,它返回一个 ` {done: Boolean, value: any} ` 对象 ,这里 ` done:true ` 表明迭代结束,否则 ` value ` 就是下一个值。
298+ - ` Symbol.iterator ` 方法会被 ` for..of ` 自动调用,但我们也可以直接调用它 。
299299- 内置的可迭代对象例如字符串和数组,都实现了 ` Symbol.iterator ` 。
300- - 字符串迭代器能够识别 UTF-16 扩展字符。
300+ - 字符串迭代器能够识别代理对(surrogate pair)。(译注:代理对也就是 UTF-16 扩展字符。)
301301
302302
303- 有索引属性和 ` length ` 属性的对象被称为** 类数组对象** 。这种对象也许也有其他属性和方法 ,但是没有数组的内建方法。
303+ 有索引属性和 ` length ` 属性的对象被称为 ** 类数组对象** 。这种对象可能还具有其他属性和方法 ,但是没有数组的内建方法。
304304
305- 如果我们深入了解规范 —— 我们将会发现大部分内建方法都假设它们需要处理可迭代对象或者类数组对象,而不是真正的数组 ,因为这样抽象度更高。
305+ 如果我们仔细研究一下规范 —— 就会发现大多数内建方法都假设它们需要处理的是可迭代对象或者类数组对象,而不是“真正的”数组 ,因为这样抽象度更高。
306306
307- ` Array.from(obj[, mapFn, thisArg]) ` 将可迭代对象或类数组对象 ` obj ` 转化为真正的 ` Array ` 数组 ,然后我们就可以对它应用数组的方法。可选参数 ` mapFn ` 和 ` thisArg ` 允许我们对每个元素都应用一个函数 。
307+ ` Array.from(obj[, mapFn, thisArg]) ` 将可迭代对象或类数组对象 ` obj ` 转化为真正的数组 ` Array ` ,然后我们就可以对它应用数组的方法。可选参数 ` mapFn ` 和 ` thisArg ` 允许我们将函数应用到每个元素 。
0 commit comments