• Skip to main content
  • Skip to primary sidebar

プログラミング入門ナビ

プログラミング学習初心者のための情報メディア by Proglus(プログラス)

You are here: Home / プログラミング入門 / JavaScriptのfor文で配列要素の足し算をするとNaNが出るのはなぜ?原因と対処法を解説!

JavaScriptのfor文で配列要素の足し算をするとNaNが出るのはなぜ?原因と対処法を解説!

2020-05-28 By プログラミング入門ナビ編集部

Tweet
このエントリーをはてなブックマークに追加
Pocket

目次

  • 1 はじめに
  • 2 for文の失敗例
  • 3 NaNになる原因は?
  • 4 対処方法
  • 5 まとめ
  • 6 今すぐメルマガ登録!
  • 7 動画で学ぶプログラミング入門

はじめに

はてなマーク

JavaScriptを学習していると、比較的初歩の段階でfor文を学びますね。

繰り返し処理をするための機能で、配列データを順番に取り出して表示したり、別の値を格納していくなどの便利な使い方が可能です。

しかし、使い方に慣れるまではつまずきやすい部分でもあります。

ここでは初心者がうっかりしてしまいがちなfor文での失敗例とその対処方法を紹介します。

for文の失敗例

例えば、主要5教科:国語・算数・英語・理科・社会の合計点を求めるプログラムを書くとしましょう。

配列scoresに各教科の点数が入っていて、これを順番に取り出して合計点totalに加算していくためのコード例は下記です。

total = 0;
var scores = [35, 90, 21, 89, 70];
for(i = 0; i <= scores.length; i++) {
  total += scores[i];
}
console.log(total);

こちらを実行すると、合計点が表示されるのを期待するところですが、実際は下記の結果となってしまいます。

> NaN

NaNとは「Not-A-Number」のことで、「非数」という特別な値です。これは数字が与えられる想定の処理に対し、数字ではない値が与えられた場合に返されます。

NaNになる原因は?

なぜNaNになってしまうのでしょうか?どこで問題が起きているかわからない場合は、各所で値を表示させておかしな値が入っている箇所がないか確認するのが定石で、これをプリントデバッグと呼びます。

下記の通り、for文内にログ出力処理を追加しましょう(4行目)。

total = 0;
var scores = [35, 90, 21, 89, 70];
for(i = 0; i <= scores.length; i++) {
  console.log(scores[i]);
  total += scores[i];
}
console.log(total);

こうすることでscoresの配列から取り出した値をコンソールに表示させて確認できます。実行結果は下記の通りです。

> 35
> 90
> 21
> 89
> 70
> undefined
> NaN

上から順番に、配列内の点数が表示されています(1〜5行目)。一番下のNaNは元から出ていたものですね(7行目)。

ここで、6行目にundefinedが表示されているのにお気付きでしょうか。

for文の中で1〜6行目の値がtotalに足し合わされていきますが、undefinedは数字ではないため、これが足し合わされた後にtotalにはNaNが入ってしまったわけです。

対処方法

なぜ5個しか要素が入っていないはずの配列から6回も値が取り出されているのでしょうか。もう一度for文の繰り返し条件を見てみましょう。

for(i = 0; i <= scores.length; i++)

scoresの要素数は5個なので、scores.lengthには5が入ります。つまり、iは0からスタートし「0、1、2、3、4、5」の合計6回繰り返されるわけです。

そして、配列の要素はsocres[0]が1番目、scores[1]が2番目というふうに対応しています。 n番目の要素を取り出すにはscores[n-1]のように、1つ減らした数字を使って取り出す必要があるのです。

そのため、要素が5個の場合はscores[4]が最後の要素となり、scores[5]は未定義なので取り出そうとするとundefinedが返ります。

実際に取り出してみた例が下記です。最後の列で、数字とundefinedを足そうとしてNaNが返っているのが分かりますね。

var scores = [35, 90, 21, 89, 70];
console.log(scores[0]);						//35
console.log(scores[5]);						//undefined
console.log(scores[0] + scores[5]);	  //NaN

これに対処するには、繰り返しをi=4で止めるように修正しましょう。for文繰り返し条件を「i がscores.length以下」としていたのを「iがscores.length未満」に変更します(下記3行目)。

total = 0;
var scores = [35, 90, 21, 89, 70];
for(i = 0; i < scores.length; i++) {
  console.log(scores[i]);
  total += scores[i];
}
console.log(total);

実行してみると、無事総合点が表示されました。

> 305

まとめ

ハイタッチする仲間たち

JavaScriptのfor文でNaNが出てしまう原因と対処方法についてご紹介しました。

実はJavaScriptに限らず、他の言語の繰り返し処理でも同様のミスをしてしまいがちです。

起っている現象としては全く同じで、繰り返し条件の間違いにより無いはずの配列要素にアクセスしてしまうことが原因なので、つまずいたら1度チェックする癖をつけましょう。

動画で学ぶプログラミング入門

オンラインスクールProglus(プログラス)でプログラミングを学んで、創れる人になろう!

在宅学習応援!今なら複数の基礎コースが無料!!

今すぐ詳細を確認する

Tweet
このエントリーをはてなブックマークに追加
Pocket

Filed Under: プログラミング入門 Tagged With: for文, JavaScript, NaN

Primary Sidebar

Proglus

Twitter

Follow @programmingnavi Tweets by programmingnavi

人気の記事

  • 無料のSSL証明書Let’s Encryptを設定・更新・自動更新する方法(CentOS7, Apache2.4対応)
  • MySQLをXAMPPを使ってWindows環境にインストールする方法
  • 初心者のプログラミング学習には13インチのMacBook Proがおすすめ!その理由も解説!
  • Visual Studio CodeでHTMLを書くときの便利な設定方法!ミスの防止や開発効率UPに役立てよう
  • よくあるSQLのエラーの種類と自力でエラーを取り除く方法について説明します
  • Apacheインストール時にエラー Cannot find a valid baseurl repo: base/7/x86_64
  • macOSで2つのファイルの差分を確認するには?便利なdiffツールを紹介
  • AWS Cloud9のプレビューが上手く表示されない時の対処法
  • WindowsからSSHでサーバに接続する方法(RLogin利用)
  • MySQL 5.7 for Windowsのアンインストール方法

最近の投稿

  • ウェブアプリケーションエンジニアになりたい!何を学習するべきか?
  • VSCodeで画像が表示されない場合の対処法
  • プログラミング学習での「質問のお作法」を理解しよう!最小限のやりとりで効率的に解決!
  • VirtualBoxでNATとホストオンリーアダプターによる安全なネットワーク環境構築方法
  • TypeScriptとは?JavaScriptとの違いは?人気の理由を徹底解説!

カテゴリー

  • エンジニアのしごと
  • エンジニアへの道
  • ツールの使い方
  • ニュース
  • プログラミング入門

タグクラウド

AI AWS AWS Cloud9 Bootstrap Cloud9 CodeWing CSS Git GitHub Heroku HTML JavaScript li Linux macOS MySQL MySQL Workbench Nuxt.js ol Proglus Python Ruby Ruby on Rails SQL Udemy vscode Vue.js Web開発 Windows インストール エラー エンジニア オンライン学習 サーバー スクリーンショット セール プログラミング プログラミング入門 プログラミング学習 ユーデミー 初心者 改行 未経験 機械学習 開発環境構築

アーカイブ

  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年11月
  • 2019年9月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年10月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月

検索

Copyright © 2021 · programmingnavi.com ・About・プライバシーポリシー