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);
出力: undefined期待: 1 (エラーにはなりません)
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);
出力: undefined期待: 1 (エラーにはなりません)
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);
出力: undefined期待: 1 (エラーにはなりません)
users.pushの戻り値は新しい要素数(数値)です。配列として扱いたい場合はconcatを使います。
直し方: push を concat にします。
よくある誤解
「配列に追加するメソッドは更新後の配列を返すはず」という思い込みは、pushには当てはまりません。配列そのものを返してほしい場合はconcat()のような非破壊的なメソッドを使います。
まとめ
push()の戻り値は追加後の配列ではなく新しい要素数は初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。