2012-01-18 11 views
8

Qualcuno mi ha inviato questa email:In che modo due stringhe identiche non si equivalgono?

Perché entrambi questi avvisi sono falsi?

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

Ecco una demo

JSFiddle DEMO

+4

Ha-ha ... Sembra di scrivere un altro 'a'-s in un'altra lingua xD –

+3

Copiato e incollato in un file. Visto con editor esadecimale. Sì, una "a" su ciascun lato è 61 E2 80 8C ('a' + un unicode char). –

+0

E2808C è il carattere Unicode 'Zero Width Non-Joiner' ed è invisibile quando non è rilevante per il testo che viene dato. È, tuttavia, abbastanza valido in una stringa. – Rushyo

risposta

14

Si tratta di un trucco? Hai generato quelli a's con qualche magia unicode speciale? Ho eliminato le a's e ri-digitati loro, e ora entrambi avvisi mostrano true, come dovrebbero

Updated Fiddle

+0

@tryurbest: entrambi mostrano ancora il vero per me http://jsfiddle.net/sQrST/3/ –

14

La prima a di ciascuno non è in realtà un semplice a. Se posizioni il cursore subito dopo e premi Backspace, cancelli "qualcosa", quindi restituisce true.

ho copiato la stringa a, questo è ciò che ottengo quando si esegue questo codice:

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

string(4) "a‌" 

vedere cosa c'è di sbagliato? La lunghezza della stringa è 4.

Inoltre, questo:

echo base64_encode($a); 

..returns:

YeKAjA== 

Quando, per una semplice stringa con la lettera a, dovrebbe essere solo YQ==.

Il carattere extra è chiamato "ZERO WIDTH NON-JOINER".

6

Per la prima 'a' console dice:

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

8204 sembra essere un valore Unicode per Zero-width non-joiner

Mentre per il secondo la sua:

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

E 'naturale che diversi le stringhe sono diverse :).

+0

Che cos'è? un carattere null? – qwertymk

+0

@qwertymk Si chiama "Zero-width non-joiner" - di solito viene utilizzato nelle lingue arabe. – Li0liQ

Problemi correlati