push() / pop() / shift() / unshift()

4つとも元の配列を書き換えます。それぞれの戻り値、空配列で何が返るか、配列を丸ごと足すと入れ子になる理由、元を変えずに同じことをする書き方までを実行して確かめます。

実行して検証済み処理系Node 22.22.3対応ES3難易度○○○○目安8更新

4つとも元の配列を書き換えます 新しい配列は返りません。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
4 [ 1, 2, 3, 4 ] 4 [ 1, 2, 3 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
1 [ 2, 3 ] 3 [ 0, 2, 3 ]

戻り値が違います。

  • push() … 足したあとの長さ
  • pop() … 取り出した要素

4つの違い

メソッド 場所 戻り値
push(値) 末尾に足す 足したあとの長さ
pop() 末尾から取る 取った要素
unshift(値) 先頭に足す 足したあとの長さ
shift() 先頭から取る 取った要素
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
undefined undefined 0 0
javascript
const items = [1, 2];

items.push([3, 4]);

console.log(items);
[ 1, 2, [ 3, 4 ] ]

足す系は長さ、取る系は要素、と覚えると取り違えません。

先頭を触る shift() / unshift() は、後ろの要素を全部ずらします。件数が多いと末尾より遅くなります。

空の配列では

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, 2, 3, 4 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, 2, 3, 4 ] [ 1, 2 ]

例外にはなりません。 undefined が返るだけです。

「取れた」のか「空だった」のかを、戻り値だけでは区別できません。 undefined を要素として入れている配列では、なおさら分かりません。 先に length を見てください。

配列を足すと入れ子になる

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, 2, 3, 4 ] [ 0, 1, 2, 3 ] [ 1, 2, 3 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 2, 3 ] [ 99, 2, 3 ] [ 3, 2, 1 ] [ 1, 2, 3 ]

push()渡したものをそのまま1つの要素として入れます。

中身を並べたいなら、スプレッド構文で開いてください。

javascript
const items = [1, 2, 3];
const added = items.push(4);

console.log(added);
4
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, 2, 3, 4 ]

concat() なら、元を変えずに繋げた新しい配列が返ります。

javascript
const queue = [1, 2, 3];

for (let i = 0; i < queue.length; i++) {
queue.shift();
}

console.log(queue);
[ 3 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, 2, 3 ] []

push(...huge) は引数として全部展開するので、要素が非常に多いと上限に当たることがあります。件数が読めないときは concat() かループを使ってください。

元を変えたくないとき

書き換えたくないなら、そもそも使わないのがいちばん簡単です。

取り除く・置き換える側にも、元を変えない対があります(ES2023)。

書き換える 元を変えない
push() / unshift() [...items, x] / [x, ...items]
pop() / shift() items.slice(0, -1) / items.slice(1)
splice() toSpliced()
items[0] = x with(0, x)
reverse() toReversed()
sort() toSorted()

toSpliced() / with() / toReversed() は Node 20 / Chrome 110 / Safari 16 より前では使えません。

slice() と splice()

よくある間違い

戻り値を新しい配列だと思う

返るのは長さです。配列ではありません。 added.map(...) と書けば、そこで落ちます。

const だから安全だと思う

const が固定するのは名前と値の結びつきで、中身ではありません。 → TypeError: Assignment to constant variable.

共有している配列に push() すると、見ている全員に影響します。

繰り返しの中で shift() する

取り出すたびに length が減るので、途中で条件が成立して止まります。

全部取り出すなら while にしてください。

まとめ

  • 4つとも元を書き換える
  • 足す系は長さ、取る系は要素を返す
  • 空配列では undefined。例外にはならない
  • 配列を push() すると入れ子になる。... で開く
  • 元を変えないなら [...items, x]toSpliced() / with()
  • const でも中身は変わる

この記事の根拠

  1. Array.prototype.push — ECMAScript® 2026 Language Specificationtc39.es
  2. Array.prototype.shift — ECMAScript® 2026 Language Specificationtc39.es
  3. Array.prototype.with — MDNdeveloper.mozilla.org

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)