2009-10-21 17 views
10

Sto provando a scrivere un prototipo per determinare se una stringa è vuota. È davvero solo giocare con JS e prototipo, niente di importante. Ecco il mio codice:Operatore identità JavaScript su stringhe

String.prototype.IsEmpty = function() { 
    return (this === ""); 
} 

Avviso ho usato il paragone === identità, invece di == uguaglianza. Quando eseguo la funzione con la definizione di cui sopra:

"".IsEmpty(); // false 

Se chagne la definizione da utilizzare come ==:

String.prototype.IsEmpty = function() { 
    return (this == ""); 
} 

Il nuovo def'n farà:

"".IsEmpty(); // true 

I non capisco perché === non funziona perché "" è identico a ""

risposta

10

È perché "" è una stringa primitivo, ma quando si chiama .IsEmpty() E 'implicitamente convertito in un oggetto String.

Avresti bisogno di chiamare .toString() su di esso:

String.prototype.IsEmpty = function() { 
    return (this.toString() === ""); 
} 

È interessante notare che questo è specifica del browser - typeof this è string in Chrome.

Come @pst sottolinea, se doveste convertire l'altro modo e confrontare this === new String(""); non funzionerebbe ancora, in quanto sono istanze diverse.

+0

Stavo proprio pensando a questo: String vs. stringa. Grazie per la correzione. –

9

=== è identità (stesso oggetto; x è x **). == è uguaglianza (stesso valore; x assomiglia a y).

consente di riprodurre alcuni (Rhino/JS 1.8):

{} === {} // false 
new String("") === new String("") // false 
typeof new String("") // object 

"" === "" // true 
typeof "" // string 
f = function() { return "f" }; 
"foo" === f() + "oo" // true 

String.prototype.foo = function() { return this; }; 
typeof "hello".foo() // object -- uh, oh! it was lifted 

Quindi, quello che è appena successo?

La differenza tra un oggetto String e una stringa. Ovviamente, dovrebbe essere usato il confronto di uguaglianza (o lunghezza).

La proof in the pudding, sezione 11.9.6 discute l'algoritmo operatore ===

+1

Inoltre, aggiungerebbe 0, false, "", una corrispondenza nulla e talvolta indefinita con operazioni di uguaglianza, che possono causare graffi alla testa. – Tracker1