2014-07-10 5 views
5

Bis vor kurzem erkannte ich nicht, dass es in JavaScript zwei Arten von Strings (und Bools und Zahlen) gibt: Primitive wie "blah" und Objekte wie new String("blah").Liefern Standard-JavaScript-APIs oder -Bibliotheken Zeichenfolgen als String-Objekte?

Sie in sehr „Gotcha“ -prone Weise unterscheiden, die größte von denen die verschiedenen typeof Wert ("string" vs "object") zu sein scheint, aber eine Reihe anderer Unterschiede bestehen, einige documented at MDN.

Es macht keinen Sinn, String-Objekte zu erstellen, da die primitiven Strings genauso gut funktionieren, und JSHint even treats this as an error. Daher möchte ich wirklich vorgeben, dass String-Instanzen nicht einmal existieren und nur einfache Strings in meinem Code unterstützen.

Das lässt mich fragen: Kann ich eine Überraschung String-Instanz durch Aufruf einer Standard-API, die eine Zeichenfolge zurückgibt? Oder ist es wirklich sicher anzunehmen, dass, wenn jemand nicht durch ausdrückliches Schreiben new String vermasselt, ich nie einen von diesen sehen werde?

+0

Was meinen Sie mit einer "Standard JavaScript API"? Die nativen JS-Funktionen? Das DOM Apis? Node.js Module? – Bergi

+0

@Bergi Die nativen Funktionen, die DOM-APIs und eine vage definierte "populäre JS-Bibliotheken". Die Frage ist nicht, ob es theoretisch möglich ist, einem zu begegnen (die Antwort darauf ist offensichtlich), aber ob es dumm wäre anzunehmen, ich würde es in keiner vernünftig kodierten Anwendung sehen. –

Antwort

1

This github search zeigt, dass einige Leute new String verwenden.

Und this answer hat eine schöne Erklärung für String obj:

keine native JavaScript-Objekt, großen Bibliothek oder DOM-Methode, die zurückgibt ein String ein String-Objekt anstelle eines String-Wert zurück. Wenn Sie jedoch absolut sicher sein möchten, dass Sie einen String-Wert haben eher als ein String-Objekt, können Sie es wie folgt konvertieren:

var str = new String("foo"); 
str = "" + str; 
+0

Die meisten Suchergebnisse finden nur Edge-Case-Tests – Bergi

0

Ich bin nicht bekannt, dass Konvention nur primitive Zeichenfolgen verwenden . Es gibt auch eine ständig wachsende Menge an APIs, und ich bin mir ziemlich sicher, dass hin und wieder jemand den Konstruktor-Trick ziehen wird. Ich möchte einige Debugging-Tipps geben, wie man diesen Quicky erkennt, aber ich denke, der typeof Check ist der einzige offensichtliche Weg, den Unterschied schnell zu notieren.

Sie einen Scheck wie this answer verwenden könnte, obwohl ich denke, dass es sich nicht lohnt die Mühe:

function isString(string){ 
    return typeof myVar == 'string' || myVar instanceof String; 
}; 

isString("foo");    //returns true 
isString(new String("bar")); //returns true 
isString({});    //returns false; 

Fazit: Ich habe Angst, Sie müssen nur beten, dass Sie nicht diese schrullige Sie begegnen Eckfälle.

Verwandte Themen