2009-10-21 7 views
10

J'essaye d'écrire un prototype pour déterminer si une chaîne est vide. C'est vraiment juste de jouer avec JS et le prototype, rien d'important. Voici mon code:Opérateur d'identité JavaScript sur les chaînes

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

Avis J'utilisé la comparaison identité === au lieu de l'égalité ==. Quand je lance la fonction de la définition ci-dessus:

"".IsEmpty(); // false 

Si je CHAGNE la définition à utiliser == comme:

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

Le nouveau déf fera:

"".IsEmpty(); // true 

I Je ne comprends pas pourquoi === ne fonctionne pas puisque "" est identique à ""

Répondre

10

C'est parce que "" est une chaîne primitive, mais quand vous appelez .IsEmpty() il est converti implicitement à un objet String.

Vous auriez besoin d'appeler .toString() sur elle:

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

Fait intéressant c'est spécifique au navigateur - typeof this est string dans Chrome. Comme @pst le fait remarquer, si vous deviez convertir l'inverse et comparer this === new String("");, cela ne fonctionnerait toujours pas, car ce sont des instances différentes.

+0

Je pensais juste à ce sujet - Chaîne vs chaîne. Merci pour la correction. –

9

=== est identité (même objet; x est x **). == est égalité (même valeur; x ressemble à y).

permet de jouer quelques-uns (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 

Alors, que vient de se passer?

La différence entre un objet String et une chaîne. Bien sûr, l'égalité compare (ou .length) doit être utilisée.

La proof in the pudding, la section 11.9.6 traite de l'algorithme opérateur ===

+1

Ajouterait également que 0, false, "", null et parfois indéfini correspondent aux opérations d'égalité, ce qui peut provoquer des rayures sur la tête. – Tracker1

Questions connexes