diff --git a/docs/array.md b/docs/array.md index e44205b..b0148b7 100644 --- a/docs/array.md +++ b/docs/array.md @@ -58,17 +58,20 @@ const arr = [ // [1] ``` -注意,扩展运算符如果放在括号中,JavaScript 引擎就会认为这是函数调用,否则就会报错。 +注意,扩展运算符如果放在括号中,JavaScript 引擎就会认为这是函数调用。如果这时不是函数调用,就会报错。 ```javascript -(...[1,2]) +(...[1, 2]) // Uncaught SyntaxError: Unexpected number -console.log((...[1,2])) +console.log((...[1, 2])) // Uncaught SyntaxError: Unexpected number + +console.log(...[1, 2]) +// 1 2 ``` -上面两种情况都会报错,因为扩展运算符所在的括号不是函数调用,而`console.log(...[1, 2])`就不会报错,因为这时是函数调用。 +上面前两种情况都会报错,因为扩展运算符所在的括号不是函数调用,而第三种情况`console.log(...[1, 2])`就不会报错,因为这时是函数调用。 ### 替代函数的 apply 方法 @@ -282,7 +285,7 @@ str.split('').reverse().join('') **(5)实现了 Iterator 接口的对象** -任何 Iterator 接口的对象(参阅 Iterator 一章),都可以用扩展运算符转为真正的数组。 +任何定义了遍历器(Iterator)接口的对象(参阅 Iterator 一章),都可以用扩展运算符转为真正的数组。 ```javascript let nodeList = document.querySelectorAll('div'); @@ -291,6 +294,20 @@ let array = [...nodeList]; 上面代码中,`querySelectorAll`方法返回的是一个`NodeList`对象。它不是数组,而是一个类似数组的对象。这时,扩展运算符可以将其转为真正的数组,原因就在于`NodeList`对象实现了 Iterator 。 +```javascript +Number.prototype[Symbol.iterator] = function*() { + let i = 0; + let num = this.valueOf(); + while (i < num) { + yield i++; + } +} + +console.log([...5]) // [0, 1, 2, 3, 4] +``` + +上面代码中,先定义了`Number`对象的遍历器接口,扩展运算符将`5`自动转成`Number`实例以后,就会调用这个接口,就会返回自定义的结果。 + 对于那些没有部署 Iterator 接口的类似数组的对象,扩展运算符就无法将其转为真正的数组。 ```javascript diff --git a/docs/object.md b/docs/object.md index f86f30c..7277f20 100644 --- a/docs/object.md +++ b/docs/object.md @@ -455,15 +455,7 @@ obj.foo() // "world" ## 对象的扩展运算符 -《数组的扩展》一章中,已经介绍过扩展运算符(`...`)。 - -```javascript -const [a, ...b] = [1, 2, 3]; -a // 1 -b // [2, 3] -``` - -ES2018 将这个运算符[引入](https://github.com/sebmarkbage/ecmascript-rest-spread)了对象。 +《数组的扩展》一章中,已经介绍过扩展运算符(`...`)。ES2018 将这个运算符[引入](https://github.com/sebmarkbage/ecmascript-rest-spread)了对象。 ### 解构赋值