Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
sort() は Array のメソッドで、配列の要素をその場 (in-place) でソートし、ソートされた同じ配列の参照を返します。既定のソート順は昇順で、要素を文字列に変換してから、 UTF-16 コード単位の値の並びとして比較します。
ソートの時間的・空間的予測値は実装に依存するため、保証はできません。
元の配列を変更せずに配列内の要素をソートするには、 toSorted() を使用してください。
要素の順序を決定する関数。この関数は、次の引数で呼び出されます。
a比較する第一要素。 undefined になることはありません。
b比較する第二要素。 undefined になることはありません。
これは、以下の数値を返します。
これを覚えるには、(a, b) => a - b は数値を昇順でソートすることを覚えておいてください。
省略した場合、配列の要素は文字列に変換され、それぞれの文字の Unicode コードポイントの値に従ってソートされます。
ソートされた元の配列への参照です。なお、配列はその場でソートされ、コピーは作成されません。
compareFn が与えられなかった場合、undefined 以外のすべての配列要素は文字列に変換され、文字列が UTF-16 コード単位順でソートされます。例えば、"banana" は "cherry" の前に来ます。数値のソートでは、9 が 80 の前に来ますが、数値は文字列に変換されるため、Unicode 順で "80" が "9" の前に来ます。undefined の要素はすべて、配列の末尾に並べられます。
sort() メソッドは空のスロットを保持します。疎配列の場合、空のスロットは配列の末尾に移動され、常にすべての undefined の後に置かれます。
メモ: UTF-16 では、\uFFFF を超える Unicode 文字は 2 つのサロゲートコード単位にエンコードされ、\uD800 - \uDFFF の範囲になります。それぞれのコード単位の値は比較では別々に扱われます。したがって、\uD855\uDE51 というサロゲートペアで形成される文字は、\uFF3A の文字よりも前に並べられます。
compareFn が与えられた場合、undefined 以外のすべての配列要素は比較関数の返値に基づきソートされます(undefined の要素はすべて、compareFn を呼び出すことなく配列の末尾へ並べられます)。
| > 0 | a を b の後に並べる(例えば [b, a]) |
| < 0 | a を b の前に並べる(例えば [a, b]) |
| === 0 | a と b の元の順序を維持する |
よって、比較関数は以下のような形式をもちます。
より正式には、適切なソート動作を保証するために、比較関数は以下の要件を満たすことが求められます。
上記の制約に適合する比較関数は、常に 1, 0, -1 のすべてを返すか、あるいは一貫して 0 を返すことができます。例えば、比較関数が 1 と 0 のみを返す場合、あるいは 0 と -1 のみを返す場合は、反対称性 が崩れるので、確実にソートすることはできません。常に 0 を返す比較関数では、配列は全く変更されませんが、それでも信頼できます。
既定の字句比較関数は、上記の制約をすべて満たしています。
文字列の代わりに数字を比較する場合、比較関数は単純に a から b を引けばよいでしょう。次のように比較関数を定義すれば昇順に並べることができます(Infinity や NaN がなければですが)。
sort() メソッドは汎用的です。このメソッドは this 値に length プロパティと整数キーのプロパティがあることだけを期待します。文字列も配列風ですが、文字列は不変なので、このメソッドを適用するのには適していません。
以下の例は 4 つの配列を生成し、元の配列を表示したのちに、ソートした配列を表示します。数値の配列は比較関数なしでソートされたのち、比較関数ありでソートされます。
オブジェクトの配列は、プロパティの値を比較することで並べ替えることができます。
非 ASCII 文字、つまりアクセント記号付き文字(e, é, è, a, ä など)を含む文字列をソートする場合、英語以外の文字列は String.prototype.localeCompare() を使用してください。この関数は、それらの文字を比較して正しい順序で表示することができます。(訳注: 日本語をソートする場合も含みます。)
compareFn (比較関数) は、配列内の要素毎に複数回呼び出されることがあります。ただ compareFn の性質によっては、これが多大なオーバーヘッドをもたらす可能性もあります。compareFn がたくさんの処理を行えば行うほど、そしてソート対象の要素数が多ければ多いほど、ソートに map を利用すると効率が上がるでしょう。すなわち、対象の配列を一度だけ走査してソート対象の実際の値を取り出し、一時的な配列に格納した上でソートを行い、その上で一時的な配列を走査して正しい並び順を実現するやりかたです。
この手法を応用した mapsort というオープンソースのライブラリーが利用できます。
sort() メソッドは元の配列への参照を返すので、返された配列を変更すると、元の配列も変更されます。
元の配列を変更せずに sort() を行いたいが、他の配列のメソッド(map() など)のようにシャローコピーを返したい場合は、 toSorted() メソッドを使用してください。他にも、 sort() を呼び出す前にスプレッド構文または Array.from() を使用してシャローコピーを行うことができます。
バージョン 10 (または ECMAScript 2019)以降、仕様書では Array.prototype.sort が安定していることが決められています。
例えば、成績と横に並んだ生徒のリストがあったとします。生徒のリストはすでにアルファベット順の名前でソートされていることに注意してください。
この配列を grade で昇順にソートした後、
変数 students は以下のような値になります。
重要なことは、同じ評点を保有する学生(例: Alex と Devlin)は、ソートを呼び出す前と同じ順番のままであることです。これは、安定したソートアルゴリズムが保証するものです。
バージョン 10 (または ECMAScript 2019) 以前は、ソートの安定性が保証されていないため、以下のような結果になる可能性があります。
比較関数が解説で説明した無害性、安定性、反射性、反対称性、推移性のルールをすべて満たしていない場合、プログラムの動作はうまく定義されません。
例えば、このコードを考えてください。
ここでの compareFn 関数は、反対称性を満たしていないため、正しい形式ではありません。 a > b ならば 1 を返しますが、 a と b を入れ替えると、負の値ではなく 0 を返すようになります。そのため、生成される配列はエンジンによって異なります。例えば、V8(Chrome、Node.js などで使用)や JavaScriptCore(Safari で使用)は配列を全くソートせず、 [3, 1, 4, 1, 5, 9] を返しますが、SpiderMonkey(Firefox で使用)は [1, 1, 3, 4, 5, 9] のように昇順に並べた配列を返すことになります。
しかし、compareFn 関数を少し変更して、-1 や 0 を返すようにすると、次のようになります。
すると、 V8 や JavaScriptCore では [9, 5, 4, 3, 1, 1] のように降順にソートされますが、 SpiderMonkey では [3, 1, 4, 1, 5, 9] のようにそのままの値を返します。
この実装上の不整合があるため、常に 5 つの制約に従うことで、比較器を正しい形にすることをお勧めします。
空のスロットは配列の末尾に移されます。
sort() メソッドは this の length プロパティを読み取ります。そして、0 から length - 1 までの範囲にある既存の整数キーのプロパティをすべて集合し、ソートして書き戻します。範囲内に存在しないプロパティがある場合、対応する末尾のプロパティは削除され、あたかも存在しないプロパティが末尾にソートされたかのようになります。
| ECMAScript® 2027 Language Specification # sec-array.prototype.sort |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2025年8月9日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.