Array
の sort()
を使うと、配列の内容をソートできます。このメソッドは、引数に比較用の関数を渡すとソート順をカスタマイズできますが、何も渡さないとデフォルトの順序でソートされます。
デフォルトの順序では、数値でも文字列として比較されてるのが特徴です。これは『Unicodeコードポイント順になる』という表現で解説されてるサイトが多い気がします。
が、コードポイントの昇順と言われると、個人的には↓の結果が引っかかります。
これは単に文字コード順じゃないのか??
内部的にUTF-16で処理されてる言語だから、サロゲートペア使ってる文字を渡しても1バイト目で比較されるのは、そういうものだと思うのですが。
仕様ではどういうことになってるんだろ? と思って仕様書見に行ってみたら、やはりコードポイント順とは書かれてませんでした。英語読めないのですが、comparefn
が undefined
のときは ToString
して比較するって書いてある気がします。
ECMAScript® 2018 Language Specification
ToString
して比較されてることを確認するために、気持ち悪い配列を sort
してみます。
確かに toString
後に比較してソートされたような結果になってました。しかし null
が『null』という文字列として比較されてるっぽいのは、初めて知りました。undefined
はそうではないみたいなのですが。
調べてみたところ、null
に toString
は無いけど、String(null)
の結果は文字列の null
になるようです。でも、それなら String(undefined)
も文字列の undefined
になります。が、undefined
が文字列として比較されてたらすごく嫌な気がするので、そういうものかもしれないです。
この結果をテストケースとして、sort
のデフォルトの比較関数を再現してみたのが次のコードです。
こうして見ると、思ったよりシンプルです。
というわけでこの記事の結論では、sort()
のデフォルト順は、undefined
以外の値を String
型にキャストして比較演算子で比較した結果の昇順です。一言で言うと、文字コード (UTF-16コード) の昇順です。