Newsgroup: it.comp.lang.javascript
Titolo: wtf.js

>> [1,2,10,3].sort()
[1, 10, 2, 3]
 
(si, lo so, lo so: la cosa è documentata e sono io che dovevo saperlo, ed è 
anche *vagamente* consistente su come javascript tratta alcune cose, pero' 
dai....)
 
-- 
ZeD

 dai....)
 
Secondo me il senso di stranezza lo hai perché si associa a un simile
array una sorta di "tipizzazione", quindi a vederlo sembra un array
"numerico", e ci si aspetterebbe un sorting di default basato in tal
senso. Essendo gli array non tipizzati, e potendo avere qualsiasi valore
(sia primitive che oggetti), alla fine un ordinamento di default basato
sulla rappresentazione stringa dell'elemento è abbastanza generico, ed
ha anche senso secondo me.
 
Posso capire che a chi viene da altri linguaggi possa sembrare strano,
per carità. :)
 

>> ['\u00F1', '\u006E\u0303', '\u006f'].sort()
array: ["ñ", "o", "ñ"]
 
 
come puoi vedere, il primo e l'ultimo elemento dell'array, dopo 
l'ordinamento, sono lo stesso carattere 
(
http://en.wikipedia.org/wiki/Unicode_equivalence
)
in realtà la funzione di sort() sembra lavorare sulla rappresentazione 
interna, non sul "carattere".
 
-- 
ZeD

 avviene in ordine lessicografico (oppure ho trovato un bel bug in ff!)
 
Infatti avviene secondo la sua versione stringa, e i caratteri che
menzioni tu sebbene equivalenti dal punto di vista di rendering sono
composti da due stringhe differenti (lo si vede anche dal fatto che sono
stringhe di lunghezze diverse) quindi è normale che vengano ordinati in
quel modo.
 

 quel modo.
 
mmm, è che per me "lessicografico" è un concetto un po' più ad alto livello 
della rappresentazione del byte: se due sequenze diverse rappresentano lo 
stesso carattere, mi aspetterei che vengano trattate come se fossero lo 
stesso carattere.
 
Poi, vabè, magari è questione di lana caprina, ma sarei curioso di sapere 
che cosa dovrebbe succedere - nelle varie implementazioni e nello standard - 
nell'ordinamento di stringhe che contengono caratteri unicode equivalenti.
 
-- 
ZeD
 

 nell'ordinamento di stringhe che contengono caratteri unicode equivalenti.
 
Fintanto che sono stringhe diverse, verranno ordinate in modo diverso.
Poi magari qualcuno farà una funzione custom di sorting che tiene di
conto le equivalenze dei caratteri unicode ;)
 

 Fintanto che sono stringhe diverse, verranno ordinate in modo diverso.
 
eh, sto vedendo (§11.8.5 The Abstract Relational Comparison Algorithm - NOTE 
2)
 
    The comparison of Strings uses a simple lexicographic ordering on
    sequences of code unit values. There is no attempt to use the more
    complex, semantically oriented definitions of character or string
    equality and collating order defined in the Unicode specification.
    Therefore String values that are canonically equal according to the
    Unicode standard could test as unequal.
    In effect this algorithm assumes that both Strings are already in
    normalised form. Also, note that for strings containing supplementary
    characters, lexicographic ordering on sequences of UTF-16 code unit
    values differs from that on sequences of code point values.
 
mmm... :(
 
tra l'altro non riesco a trovare nessuna funzione "normalizza" che trasformi 
una stringa unicode nella forma normalizzata. (sono cecato?)
 
-- 
ZeD

 una stringa unicode nella forma normalizzata. (sono cecato?)
 
No, non c'è. Anche il browser (DOM, CSS, etc) non attua la
normalizzazione. In nodejs mi pare di ricordare che c'è una libreria che
lo fa, ma comunque non fa parte delle specifiche del linguaggio.