質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • JavaScript

    16966questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

配列に値を追加するとき、Array#pushを使用するべき理由とは?

解決済

回答 2

投稿 ・編集

  • 評価
  • クリップ 1
  • VIEW 3,575

sounisi5011

score 699

Airbnb JavaScript Style Guide 日本語訳

上記ページにて、配列の長さが不明な場合はArray#pushを利用するべきと書かれています。
なぜ、Array#pushを利用するべきなのでしょうか?

実行速度の点で見れば、array[array.length]の方が早い動作となります。

JavaScript Array.push Performance
渋谷で働くエンジニアの開発メモ: javascript高速化のポイント12
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

とりあえず、ECMAScriptの規格書にあたってみましたが(15.4.4.7)、Array#pushでの配列の変化はarray[array.length]へ代入するのとほぼ変わらないようでした。

pushのメリットを挙げていくと、
  • 一気に複数個をpushできる
  • 同じ配列名を繰り返さず、DRYに書ける
  • コードが短い
といったところでしょうか。もちろん、速度が何より重要な場面であればそっちを優先せざるを得ませんが、そうでないような場面であればコードの見た目としてはpushのほうがきれいになる、というのが自分なりの結論です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/04 10:53

    私も同意見です。
    特に、「同じ配列名を繰り返さず、DRYに書ける」この部分が大きいと思います。

    キャンセル

checkベストアンサー

0

確証はないが、マルチスレッドで array への要素追加が発生した際に、動作に変化があるかもしれないです。

  array[array.length] = val
   array.length の取得の後に、別スレッドで array の長さが変化変化してしまっていると、
   要素の値を上書きしてしまう可能性があるかもしれない。
   
  array.push(val)
    push() 操作が スレッドセーフになっていれば、↑ のような心配はしないですむかもしれない。

javascript の push と length で検索していて、ちょっとおもしろいページをみつけたので紹介します。

  • Javascript Array Push VS Reference by Index [http://webtricksandtreats.com/javascript-array-push/](vhttp://webtricksandtreats.com/javascript-array-push/)
...
 According to google’s javascript guidelines, you should always use index when possible as they will outperform array push. 
...
 With mobile devices browsers reference by index will out perform javascript array push, since most mobile devices browsers are not as powerful as an actual computer browser. 
...
速度の違いも改めていろいろな環境で改めて計測をすると、どちらが本当に速いかは 一概にいえない可能性もあるのかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/18 09:17

    http://webtricksandtreats.com/javascript-array-push/ を見てみました。
    Google翻訳に頼りながら読み進めました所、

    - 現在のブラウザにおいて、Array#pushと`array[array.length]`に大きな差は無い
    - モバイルブラウザでは`array[array.length]`が失敗する可能性がある

    という趣旨の内容が書かれていると判断しました。

    今まで私は、速度を重視したJavaScriptを書くようにしてきましたが、その結果動作しなくなる可能性があるという点について完全に考慮出来ていませんでした。
    ありがとうございます。

    ※Google翻訳に頼っているため、私の理解に誤りがあるかも知れません。その場合、指摘していただけると有難いです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16966questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。