为什么 Symbol.iterator 被设计为 Symbol 类型?
Why Symbol.iterator was designed of type Symbol?
我正在学习 Symbol
和 JavaScript 中的迭代器。
我已经阅读并观看了一些关于它们的视频,所以它们现在或多或少都清楚了。
我只是想了解我的教科书(Eloquent JavaScript)是什么意思:
Note that the next
, value
and done
property names are plain strings, not symbols. Only Simbol.iterator
, which is likely to be added to a lot of different objects, is an actual symbol.
为什么可能在不同对象中找到的属性需要是一个符号?
objOne.iterator
和 objTwo.iterator
作为常规属性会产生问题吗?
符号是对象的独特属性。如果一个人创建了一个符号并将其放在一个对象上,那么任何其他符号都不可能被放在该对象上并由于名称冲突而导致错误。
使用 Symbol.iterator
作为 迭代器的唯一符号 潜在的 any 对象消除了 属性 的可能性碰撞错误。例如,如果 .iterator
改为使用 (string) 属性,则对象不再容易拥有 .iterator
属性 除非 它专门实现了迭代器协议。
还要考虑遗留代码,这些代码可能包含带有 iterator
属性 的对象,但不打算成为 ES2015+ 迭代器 - 它们应该怎么办?最好使用 Symbol,这样就不必担心这些东西了。
anyPossibleObj[Symbol.iterator]
比 anyPossibleObj.anyStringYouCouldThinkOf
.
安全得多
我正在学习 Symbol
和 JavaScript 中的迭代器。
我已经阅读并观看了一些关于它们的视频,所以它们现在或多或少都清楚了。
我只是想了解我的教科书(Eloquent JavaScript)是什么意思:
Note that the
next
,value
anddone
property names are plain strings, not symbols. OnlySimbol.iterator
, which is likely to be added to a lot of different objects, is an actual symbol.
为什么可能在不同对象中找到的属性需要是一个符号?
objOne.iterator
和 objTwo.iterator
作为常规属性会产生问题吗?
符号是对象的独特属性。如果一个人创建了一个符号并将其放在一个对象上,那么任何其他符号都不可能被放在该对象上并由于名称冲突而导致错误。
使用 Symbol.iterator
作为 迭代器的唯一符号 潜在的 any 对象消除了 属性 的可能性碰撞错误。例如,如果 .iterator
改为使用 (string) 属性,则对象不再容易拥有 .iterator
属性 除非 它专门实现了迭代器协议。
还要考虑遗留代码,这些代码可能包含带有 iterator
属性 的对象,但不打算成为 ES2015+ 迭代器 - 它们应该怎么办?最好使用 Symbol,这样就不必担心这些东西了。
anyPossibleObj[Symbol.iterator]
比 anyPossibleObj.anyStringYouCouldThinkOf
.