2014-07-10 10 views
5

Fino a poco tempo fa, non mi ero reso conto che esistono due tipi di stringhe (e boolè e numeri) in JavaScript: primitive come "blah" e oggetti come new String("blah").Qualche API o librerie JavaScript standard restituiscono le stringhe come oggetti String?

Si differenziano per molto "Beccato" modi -prone, il più grande dei quali sembra essere il diverso valore di typeof ("string" vs "object"), ma un certo numero di altre differenze esistono, alcuni documented at MDN.

Non ha senso creare oggetti String perché le stringhe primitive funzionano altrettanto bene e JSHint even treats this as an error. Quindi mi piacerebbe davvero fingere che le istanze String non esistano nemmeno e supportano solo stringhe primitive nel mio codice.

Questo mi fa meraviglia: posso ottenere un'istanza di stringa sorpresa chiamando alcune API standard che restituiscono una stringa? O è davvero sicuro assumere che a meno che qualcuno non smetta di scrivere esplicitamente new String, non vedrò mai uno di questi?

+0

Che cosa intendi per "API JavaScript standard"? Le funzioni JS native? Le apis DOM? Moduli Node.js? – Bergi

+0

@Bergi Le funzioni native, le API DOM e le "librerie JS popolari" vagamente definite. La questione non è se sia teoricamente possibile incontrarne uno (la risposta è ovvia), ma se sarei sciocco a pensare che non ne vedrò uno in qualsiasi applicazione ragionevolmente ben codificata. –

risposta

1

This github search indica che alcune persone utilizzano new String.

E this answer ha una bella spiegazione per String obj:

Nessun oggetto JavaScript nativo, importante biblioteca o un metodo DOM che restituisce una stringa restituisce un oggetto String anziché un valore stringa. Tuttavia, se si vuole essere assolutamente sicuri di avere un valore di stringa piuttosto che un oggetto String, è possibile convertire come segue:

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

La maggior parte dei risultati della ricerca trova solo test caso limite – Bergi

0

io non sono a conoscenza di qualsiasi convenzione per utilizzare solo le stringhe primitivi . C'è anche una quantità crescente di API disponibili, e sono abbastanza sicuro che ogni tanto qualcuno tirerà il trucco del costruttore. Vorrei dare qualche consiglio di debug su come individuare questo quicky, ma penso che il controllo typeof sia l'unico modo ovvio per notare rapidamente la differenza.

Si potrebbe utilizzare un assegno come this answer, anche se penso che non vale la pena:

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

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

Conclusione: ho paura devi solo pregare che non si verifichino questi eccentrico casse d'angolo.

Problemi correlati