2016-04-27 7 views
3

Может кто-то, пожалуйста, помогите мне лучше понять конструктивное решение о том, чтобы строки JavaScript повторялись в ES2015? Большинство итераций представляют собой сборники других вещей: Array, Set, Map, Generator (видa sorta). Строка может быть только набором строк (ну, кодов Unicode). Таким образом, если вы хотите, чтобы функция принимала набор строк (например, Set строк или генератор, который дает строки) или одной строкой, невозможно отличить намерение пользователя. Она имела в виду одну строку или итерабельность кодовых страниц? Итерация над символами кажется угловым случаем по сравнению с обходом коллекций строк. Моя склонность в этом случае будет связана с строковыми параметрами специального случая, когда (предполагаемый) тип равен stringIterable<string>.Почему строки повторяются в ES2015?

function deleteDocuments(ids /* string or Iterable<string> */) { 
    if('string' === typeof ids) { 
    deleteSingleDocById(ids); 
    } else { 
    for(let id of ids) { 
     deleteSingleDocById(id); 
    } 
    } 
} 

Что мне не хватает?

+3

Если ваша функция ожидает один параметр, она будет либо итерируемой строкой, либо итерируемым массивом. Почему бы просто не обработать итерабельность? Ваша дилемма неясна. – Pointy

+0

FWIW это также способ, которым итерация строк работала в Python. –

+0

Что ожидается результат? – guest271314

ответ

9

Это действительно продолжение принципа, предшествовавшего 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, вы ожидали использовать разные синтаксисы для итерации по массивам и строкам.

+0

Спасибо, Джереми. Вот что я понял. Похоже на неудачный след для продвижения вперед.Если я хочу итерации над (массивом) символов, которые составляют мою строку, я бы предпочел быть явным с '' string'.split ('') '. Наверное, это ни здесь, ни там, хотя на данный момент. –