push()の戻り値は追加後の配列ではなく新しい要素数
Array.prototype.pushは追加後の配列ではなく、追加後の要素数(数値)を返します。戻り値を配列として扱おうとすると、数値にはない配列のプロパティやメソッドでエラーや予期しない結果になります。
なぜエラーが出ないのか
出力: undefined
(エラーなし)- JavaScriptは何も報告しません。文法として正しいためです
出力: undefined- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 function addItem(cart, item) { 2 return cart.push (item); ^ 3 } 4 const cart = []; 5 const updatedCart = addItem(cart, "apple"); 6 console.log(updatedCart.length);
pushは追加後の配列ではなく要素数(数値)を返します。updatedCartは数値になり、.lengthはundefinedです。配列を返したいならconcatのような非破壊的メソッドを使います。
直し方: push を concat にします。
パターン2
1 function addTag(tags, tag) { 2 return tags.push (tag); ^ 3 } 4 const tags = []; 5 const updated = addTag(tags, "news"); 6 console.log(updated.length);
tags.pushは新しい要素数を返すため、updatedは数値になります。
直し方: push を concat にします。
パターン3
1 function addUser(users, user) { 2 return users.push (user); ^ 3 } 4 const users = []; 5 const updated = addUser(users, "Al"); 6 console.log(updated.length);
users.pushの戻り値は新しい要素数(数値)です。配列として扱いたい場合はconcatを使います。
直し方: push を concat にします。
パターン4
1 function addBook(shelf, book) { 2 return shelf.push (book); ^ 3 } 4 const shelf = []; 5 const updated = addBook(shelf, "Dune"); 6 console.log(updated.length);
pushは追加後の要素数(数値)を返すため、updatedは配列ではなく数値になります。
直し方: push を concat にします。
パターン5
1 function addComment(thread, comment) { 2 return thread.push (comment); ^ 3 } 4 const thread = []; 5 const updated = addComment(thread, "nice"); 6 console.log(updated.length);
配列を返す関数のつもりでpushを使うと、戻り値は数値になってしまいます。
直し方: push を concat にします。
よくある誤解
「配列に追加するメソッドは更新後の配列を返すはず」という思い込みは、pushには当てはまりません。配列そのものを返してほしい場合はconcat()のような非破壊的なメソッドを使います。
実務での勘所
配列を変更するメソッドの戻り値には統一されたルールがなく、メソッドごとに個別に覚える必要があります。pushは追加後の要素数、popは取り除いた要素そのもの、spliceは取り除いた要素の配列、sortやreverseは並べ替え後の配列自身(元の配列と同じ参照)を返します。この不統一は設計ミスというより、Array APIが長い年月をかけて別々の提案で追加されてきた歴史の産物です。新しく配列操作を書くときは、使うメソッドのMDNドキュメントで戻り値の型を毎回確認する習慣が実務では欠かせません。