你不知道扩展运算符!
我最近读了Axel Rauschmayer的一篇关于迭代的博客文章(建议你关注他,他的所有文章都是 JS 开发者的宝藏)。 这篇文章让我大开眼界,因为我学到了很多关于 JavaScript 中可迭代对象的知识。
让我们挑战我们的知识
让我总结一下我在这里学到的知识,并向你提出一个小挑战:
当我在数字上使用扩展运算符时,我希望结果是一个从 1 到给定值的数组:
寻求答案的第一步
首先要做的事情是亲自尝试一下代码,你会发现在 Number 上使用扩展运算符会引发错误 => Uncaught TypeError: X 不可迭代
那么什么是可迭代对象?
可迭代对象是一个定义了迭代行为的对象,这意味着它有一个以 Symbol.iterator 为键、以迭代器为值的属性。
该迭代器应该遵循迭代协议,也就是说它是一个返回对象的函数,该函数的 next 函数返回一个包含两个属性的对象:“value”(当前迭代的值)和“done”(一个布尔值,指示我们是否已完成此迭代器的迭代)。
扩展运算符只是这种可迭代对象的消费者:当你给它一个可迭代对象时,它会调用其 Symbol.iterator 属性的下一个函数,直到它返回一个带有 {done: true} 的对象(并且每次将结果推送到数组中)。
使用数组验证
JavaScript 中的数组是可迭代的,因为它的迭代器属性值为 Symbol.iterator 。
以下是迭代器的使用方法:
应对挑战
那么,如何让扩展运算符在输入数字时不抛出错误呢?你可以在 Number 原始包装器对象上设置 Symbol.iterator 属性。
让我们把所有数字都变成可迭代的!
结论
显然,你永远不想改变原始包装对象的原型,这太危险了。
但我认为,作为一名开发者,了解迭代和扩展运算符的工作原理非常有价值。