2009-10-21 15 views
10

Próbuję napisać prototyp do określenia, czy ciąg znaków jest pusty. To naprawdę tylko gra z JS i prototypem, nic ważnego. Oto mój kod:Operator tożsamości JavaScript na ciągi znaków

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

Wskazówka Użyłem porównania === tożsamości zamiast == równości. Po uruchomieniu funkcji z powyższej definicji:

"".IsEmpty(); // false 

Gdybym chagne definicji używania == jak:

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

Nowy def'n zrobi:

"".IsEmpty(); // true 

I nie rozumiem, dlaczego === nie działa, ponieważ "" jest identyczne z ""

Odpowiedz

10

To dlatego "" jest ciągiem prymitywne, ale podczas rozmowy .IsEmpty() to niejawnie konwertowane na String obiektu.

trzeba by zadzwonić .ToString() na nim:

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

Co ciekawe jest to przeglądarka specyficzne - typeof this jest string w Chrome.

Jak @ pst zwraca uwagę, jeśli chcesz przekonwertować w drugą stronę i porównać this === new String(""); nadal nie będzie działać, ponieważ są różne instancje.

+0

Właśnie o tym myślałem - String vs. string. Dzięki za poprawkę. –

9

=== to tożsamość (ten sam obiekt; x to x **). == to równość (ta sama wartość; x wygląda jak y).

Pozwala grać trochę 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 

Więc co się stało?

Różnica między obiektem String a ciągiem znaków. Oczywiście należy zastosować porównanie równości (lub .length).

proof in the pudding, rozdział 11.9.6 omówiono algorytm operator ===

+1

Dodał także, że 0, fałsz, "", null, a czasami niezdefiniowane dopasowanie z operacjami równości, które mogą powodować pewne drapanie głowy. – Tracker1

Powiązane problemy