2012-01-18 15 views
8

Alguien me envió este correo electrónico:¿Cómo dos cadenas idénticas no se igualan?

¿Por qué estas dos alertas a falso?

alert('a‌' == 'a'); 
alert('a‌' === 'a'); 

He aquí una demostración

JSFiddle DEMO

+4

Ha-ha ... Parece que escribe otro 'a'-s en otro idioma xD –

+3

Copiado y pegado en un archivo. Visto con editor hexadecimal. Sí, una 'a' en cada lado es 61 E2 80 8C ('a' + algo de char unicode). –

+0

E2808C es el carácter Unicode 'Zero Width Non-Joiner' y es invisible cuando no es relevante para el texto. Sin embargo, es bastante válido en una cadena. – Rushyo

Respuesta

14

Es esto un truco? ¿Generaste esos a's con alguna magia Unicode especial? He eliminado las a's y re-escrito ellos, y ahora ambos se mostrarán las alertas true, como deberían

Updated Fiddle

+0

@tryurbest - aún así ambos se muestran verdaderos para mí http://jsfiddle.net/sQrST/3/ –

14

La primera a de cada uno no es en realidad un simple a. Si coloca el cursor justo detrás de él y pulsa Retroceso, elimina "algo" y luego devuelve true.

copié la cadena de a, esto es lo que me pasa cuando se ejecuta este código:

$a='a‌'; 
var_dump($a); 

string(4) "a‌" 

ver lo que está mal aquí? La longitud de la cadena es 4.

Por otra parte, esto:

echo base64_encode($a); 

..returns:

YeKAjA== 

Cuando, por una simple cadena con la letra a, sólo debería ser YQ==.

El carácter extra se llama "ZERO WIDTH NON-JOINER".

6

Por primera 'a' de la consola dice:

'a‌'.charCodeAt(0) 
97 
'a‌'.charCodeAt(1) 
8204 

8204 parece ser un valor Unicode para Zero-width non-joiner

Mientras que para la segunda su:

'a'.charCodeAt(0) 
97 
'a'.charCodeAt(1) 
NaN 

Es natural que diferentes las cadenas son diferentes :).

+0

¿Qué es eso? un personaje nulo? – qwertymk

+0

@qwertymk Se llama "No-carpintero de ancho cero": generalmente se usa en idiomas árabes. – Li0liQ

Cuestiones relacionadas