我正在学习JavaScript中的Symbol
和迭代器。我已经读过和看过一些关于它们的视频,所以它们现在或多或少是清楚的。
我只是想理解我的教科书(雄辩的JavaScript)是什么意思:
注意
next
,value
和done
属性名是普通字符串,而不是符号。只有Simbol.iterator
是一个真正的符号,它可能会被添加到许多不同的对象中。
为什么一个可能在不同对象中找到的属性需要是一个符号?
objOne.iterator
和objTwo.iterator
作为常规属性会产生问题吗?
符号是对象的唯一属性。如果一个人创建了一个符号并把它放在一个对象上,就不会有任何其他符号被放在这个对象上,也不会因为名字冲突而导致bug。
使用Symbol.iterator
作为可能任何对象的迭代器的唯一符号可以消除属性冲突错误的可能性。例如,如果使用的(string)属性是.iterator
,对象就不能再轻易地拥有.iterator
属性,除非它特别实现了迭代器协议。
还要考虑遗留代码,可能有对象与iterator
属性,但不打算成为ES2015+迭代器-他们应该发生什么?最好使用符号,这样就不用担心那些东西了。
anyPossibleObj[Symbol.iterator]
比anyPossibleObj.anyStringYouCouldThinkOf
更安全。