为什么字符串在 ES2015 中是可迭代对象
Why are strings iterables in ES2015?
有人可以帮助我更好地理解在ES2015中使JavaScript字符串可迭代的设计决策吗?大多数可迭代对象表示其他事物的集合:Array
、Set
、Map
、Generator
(有点像)。字符串只能是字符串的集合(好吧,Unicode 代码点)。因此,如果您希望函数接受字符串集合(例如 Set
字符串或生成字符串的生成器)或单个字符串,无法区分用户的意图。她指的是单个字符串还是代码点的可迭代对象?与传递字符串集合相比,迭代字符似乎是一个极端情况。在这种情况下,我倾向于在(预期)类型为string
∪ Iterable<string>
时使用特殊情况的字符串参数。
function deleteDocuments(ids /* string or Iterable<string> */) {
if('string' === typeof ids) {
deleteSingleDocById(ids);
} else {
for(let id of ids) {
deleteSingleDocById(id);
}
}
}
我错过了什么?
这实际上是ES2015/ES6之前的原则的延续。自 Internet Explorer 8 发布以来,每个浏览器都允许您使用相同的语法遍历数组和字符串的内容。
var array = ['a', 'b', 'c'];
for (var i = 0; i < array.length; i++) {
console.log(array[i]);
}
var string = 'abc';
for (var i = 0; i < string.length; i++) {
console.log(string[i]);
}
字符串已经是"类似数组的";它们满足了隐式数组迭代协议(具有.length
和索引属性),并且每个字符在查找时都已被视为自己的字符串。我们可以争论这是否是正确的选择,但在这一点上,这是遥远的历史。如果在 ES2015 之后,您希望使用不同的语法来迭代数组和字符串,那将是一个奇怪的行为分歧。
相关文章:
- 如何在DataTables 2.1中迭代对象数组
- 基于使用angular在下拉列表中选择的对象,迭代对象内部的对象
- 为什么数组在对象内部迭代对象时存储重复值
- 为什么我不能用for Each迭代对象
- 为什么字符串在 ES2015 中是可迭代对象
- 如何通过迭代对象数组来删除某些项目
- 在不同数据选项之间循环迭代对象
- 延迟迭代对象
- 在 es6 中迭代对象并返回新对象
- Javascript:如何迭代对象[Key:value],但跳过一些键([最快的方法])
- 如何使用Meteor.js中的Template辅助对象迭代对象中的两个数组
- JavaScript如何在内部迭代对象键
- 如何迭代对象/数组中的项,并构建嵌套的JSON
- 创建一个生成器来迭代对象属性排列
- 使用map迭代对象数组
- 使用 for 循环,如何迭代对象以向其添加 id 属性
- 用于迭代对象的 for 循环
- 在角度ng重复中迭代对象的数组
- 如何在 Javascript 中迭代对象数组
- 迭代对象内部的对象