2016-05-11 18 views
5

Ho guardato tutte le domande e le risposte su StackOverflow, ma non ho trovato la risposta più semplice a questo.Javascript: String vs. Object

Qual è esattamente la differenza tra stringa e oggetto?

Per esempio, se ho questo codice:

var a = 'Tim'; 
var b = new String('Tim'); 

Che cosa è esattamente la differenza?

Capisco che new complichi il codice e new String lo rallenti.

Inoltre, capisco a==b è true, ma andando più rigorosamente a===b è false. Perché?

Mi sembra di non capire il processo dietro l'oggetto e la creazione di stringhe. Ad esempio:

var a = new String ('Tim'); 
var b = new String ('Tim'); 

a==b è false

+0

La differenza è '" test "' è una stringa e 'new String (" test ")' è un oggetto. Ecco perché "test"! == new String ("test") '. 'new String (" test ")' è un oggetto wrapper attorno alla stringa. – dfsq

+0

Capito. Potresti postare la risposta sulla logica di creazione di oggetti e stringhe in maggiori dettagli? Grazie. – super11

+0

'a == b' è' true' perché l'operatore '==' costringerà i tipi a corrispondere (nel miglior modo possibile), mentre l'operatore '===' è usato dove vuoi esplicitamente confrontare i tipi loro sono. –

risposta

6

a è di tipo stringa, che è di tipo b oggetto.

=== include typechecking e la stringa causa non è un oggetto a === b vi darà un false

new String ('Tim') === new String ('Tim') valuterà false troppo, perché entrambi sono oggetti diversi

+1

E anche 'new String ('Tim') == new String ('Tim')' (confronto casuale) è falso, perché i riferimenti oggetto vengono confrontati. Anche se gli oggetti contengono dati simili, sono oggetti diversi. Non esiste un confronto approfondito tra le proprietà degli oggetti, né nel confronto stretto o rigido. – GolezTrol

+0

Grazie. Perché usare 'new' rallenta il processo? A causa della creazione di oggetti? – super11

+2

@ super11 Sì, a causa della creazione dell'oggetto, ma anche del suo utilizzo. Un oggetto wrapper attorno a una stringa è leggermente più lento di un "semplice" buffer di caratteri, anche se la differenza è così piccola che non dovrebbe mai essere un motivo su cui basare la tua decisione. Usa quello che pensi funzioni meglio per te. – GolezTrol

3

Per le stringhe normali non v'è alcuna necessità di creare un oggetto, basta creare la variabile e assegnargli un valore.

E per quanto riguarda la tua domanda per quanto riguarda il motivo per cui == === è vero e falso è che sia perché:

== confronta i valori === confronta i valori e il tipo (uno è una stringa, uno è un oggetto).

Un altro esempio di questo è:

var a = 1;

var b = '1';

a == b // vero in quanto entrambi hanno lo stesso valore

una === b // falso come uno è una stringa e uno è un numero intero

+0

Grazie, non sapevo che a == b uscirà vero e a === b/falso. – super11

1

È possibile effettuare le seguenti operazioni per vedere la differenza:

var a = "foo"; 
var b = new String("foo"); 
console.log(a); 
console.log(b); 

enter image description here

il primo è una stringa letterale e il secondo è un Oggetto stringa. Ecco perché quando li paragoni non sono uguali ma quando confronti i loro valori sono. Puoi leggere di più sui letterali here.