2016-04-27 10 views
3

Kann mir bitte jemand helfen, die Entwurfsentscheidung, JavaScript-Strings in ES2015 iterierbar zu machen, besser zu verstehen? Die meisten Iterables repräsentieren Sammlungen anderer Dinge: Array, Set, Map, Generator (irgendwie sorta). Ein String kann nur eine Sammlung von Strings sein (na ja, Unicode-Codepoints). Wenn Sie möchten, dass eine Funktion entweder eine Zeichenkettensammlung akzeptiert (z. B. Set von Strings oder einen Generator, der Strings liefert) oder eine einzelne Zeichenfolge, gibt es keine Möglichkeit, die Absicht des Benutzers zu unterscheiden. Meinte sie eine einzelne Zeichenfolge oder eine Anzahl von Codepunkten? Das Iterieren von Zeichen scheint ein Eckfall zu sein, im Vergleich zu Stringsammlungen. Meine Neigung wäre in diesem Fall zu speziellen String-Parametern, wenn der (beabsichtigte) Typ string ÷ Iterable<string> ist.Warum sind Strings in ES2015 iterierbar?

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

Was fehlt mir?

+3

Wenn Ihre Funktion einen einzelnen Parameter erwartet, ist dies entweder eine iterierbare Zeichenfolge oder ein iterierbares Array. Warum lässt man es nicht einfach iterierbar machen? Dein Dilemma ist unklar. – Pointy

+0

FWIW Dies ist auch die Art und Weise, wie die String-Iteration in Python funktioniert hat. –

+0

Was ist das erwartete Ergebnis? – guest271314

Antwort

9

Dies ist wirklich die Fortsetzung eines Prinzips, das der ES2015/ES6 vorausging. Seit der Veröffentlichung von Internet Explorer 8 erlaubt Ihnen jeder Browser, den Inhalt von Arrays und Strings mit der gleichen Syntax zu durchlaufen.

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]); 
} 

Strings waren bereits "Array-like"; Sie erfüllten das implizite Array-Iterationsprotokoll (mit .length und indexierten Eigenschaften), und jedes Zeichen wurde beim Suchen bereits als eigene Zeichenfolge behandelt. Wir könnten darüber streiten, ob das die richtige Wahl war, aber es ist eine ferne Geschichte an diesem Punkt. Es wäre eine merkwürdige Divergenz des Verhaltens gewesen, wenn Sie nach ES2015 verschiedene Syntaxen zum Iterieren über Arrays und Strings verwenden würden.

+0

Danke, Jeremy. Das habe ich mir gedacht. Scheint wie ein unglücklicher Überrest vorzukommen.Wenn ich über die (Array von) Zeichen, die meine Zeichenkette ausmachen, iterieren möchte, würde ich es vorziehen, explizit mit ''string'.split (' ')' zu sprechen. Ich denke, das ist weder hier noch dort, an diesem Punkt. –