Javascript 为什么在ES2015中字符串是不可编辑的?

Javascript 为什么在ES2015中字符串是不可编辑的?,javascript,ecmascript-6,iterable,Javascript,Ecmascript 6,Iterable,有人能帮助我更好地理解在ES2015中使JavaScript字符串可移植的设计决策吗?大多数iterables表示其他事物的集合:数组,集合,映射,生成器(有点类似)。字符串只能是字符串的集合(Unicode代码点)。因此,如果您希望函数接受字符串集合(例如,字符串集合或生成字符串的生成器)或单个字符串,则无法区分用户的意图。她指的是一个字符串还是一组代码点?与传递字符串集合相比,对字符进行迭代似乎是一种极端情况。在这种情况下,当(预期)类型为string∪ 可编辑 function delet

有人能帮助我更好地理解在ES2015中使JavaScript字符串可移植的设计决策吗?大多数iterables表示其他事物的集合:
数组
集合
映射
生成器
(有点类似)。字符串只能是字符串的集合(Unicode代码点)。因此,如果您希望函数接受字符串集合(例如,字符串集合或生成字符串的生成器)或单个字符串,则无法区分用户的意图。她指的是一个字符串还是一组代码点?与传递字符串集合相比,对字符进行迭代似乎是一种极端情况。在这种情况下,当(预期)类型为
string
∪ <代码>可编辑

function deleteDocuments(ids /* string or Iterable<string> */) {
  if('string' === typeof ids) { 
    deleteSingleDocById(ids);
  } else {
    for(let id of ids) { 
      deleteSingleDocById(id);
    }
  }
}
函数deleteDocuments(id/*字符串或Iterable*/){
如果('string'==typeof-id){
deleteSingleDocById(ids);
}否则{
对于(让id的id){
deleteSingleDocById(id);
}
}
}

我遗漏了什么?

这实际上是ES2015/ES6之前原则的延续。自从InternetExplorer8发布以来,每个浏览器都允许您使用相同的语法循环数组和字符串的内容

var array = ['a', 'b', 'c'];

for (var i = 0; i < array.length; i++) {
  console.log(array[i]);
}
var数组=['a','b','c'];
对于(var i=0;i
var字符串='abc';
对于(变量i=0;i

字符串已经是“类似数组的”;他们实现了隐式数组迭代协议(具有
.length
和索引属性),并且每个字符在查找时都已被视为自己的字符串。我们可以争论这是否是正确的选择,但在这一点上,这是遥远的历史。如果在ES2015之后,您希望使用不同的语法来迭代数组和字符串,那么这将是一种奇怪的行为差异。

如果您的函数需要单个参数,那么它将是一个iterable字符串或iterable数组。为什么不让它成为一个可移植的过程呢?您的困境还不清楚。对于@guest271314来说,似乎是一个更好的问题。
deleteDocuments()
函数接受单个字符串或字符串集合,对于每个值,使用单个id调用
deleteSingleDocById()
。不过,我不想限制自己只接受数组。我希望调用者能够指定任何iterable,比如
集合
或生成器。这显然是一个过度简化的蒸馏过程。那又怎样?如果你期望一个可编程序,那么就做你对可编程序所做的事情。如果你希望得到一种特殊的iterable,那么设计问题可能是核心问题。@Pointy是的,但我试图将数组推广到iterable之外。谢谢,Jeremy。我就是这么想的。这似乎是一个不幸的遗留问题。如果我想迭代组成字符串的(数组)字符,我实际上更喜欢使用
'string.split(“”)
显式。我想在这一点上,这是不存在的。
var string = 'abc';

for (var i = 0; i < string.length; i++) {
  console.log(string[i]);
}