プログラミング

JavaScript超入門② 変数・型・計算を覚えよう

let、const、数値、文字列、真偽値、テンプレートリテラル、主な演算子を学びます。

「150円の品物を3個買う」とき、150 * 3と書けば合計は求められます。でも、その数字が何の値なのかは、コードだけだと分かりにくいですよね。

そこで変数へ名前を付けます。今回は、値を変えるletと変えないconst、数と文字の違いを整理し、合計金額を表示します。

コード例は1つずつ別に試してください。ブラウザのコンソールで同じconst名を繰り返し宣言してエラーが出たら、練習ページを再読み込みしてから実行します。

1. constで値へ名前を付ける

const price = 150;
const count = 3;
const total = price * count;

console.log(total);

結果は450です。priceが価格、countが個数、totalが合計になっています。

const price = 150;を分けると、constが宣言、priceが名前、150が最初の値です。=は右側の値を左側の変数へ結び付ける代入に使う記号で、数学の等号と同じ働きではありません。

名前はtotalPriceのように意味が伝わるものにします。2priceのように数字から始めたり、途中に空白を入れたりはできません。

2. 後から値を代入し直すならlet

let score = 80;
score = 90;
console.log(score);

結果は90です。scoreの値を変更する予定があるのでletを使っています。

let count = 3;
count = count + 1;
console.log(count);

右側のcount + 1で4を求め、その結果を左側へ代入するので4になります。count += 1;や、1増やすだけならcount++;とも書けます。

constは「中身が何でも完全に固定」ではない

constは同じ名前へ別の値を再代入できない宣言です。配列やオブジェクトを入れた場合、その中の要素まで自動で変更禁止になるわけではありません。

例えばconst scores = [80]; scores.push(90);はできます。配列を別の配列へ入れ替えるscores = [];はできません。この違いは配列の回で改めて扱います。

迷ったらconstを基本にし、再代入が必要なものだけletへする方が、値の変化を追いやすくなります。

3. 数値と文字列は、見た目が似ていても別物

console.log(5 + 2);
console.log("5" + "2");
console.log("5" + 2);
7
52
52

引用符のない5は数値、"5"は文字列です。+は、文字列が関わると文字をつなぐ動きになります。

「足し算のはずなのに52?」というときは、計算式より先に型を確認しましょう。型はデータの種類です。

データ 型・役割 例
数値 number 18、2.5
文字列 string "Aoi"、"18"
真偽値 boolean true、false
明示した値なし null null
値が未設定など undefined let answer;のanswer

JavaScriptの通常のnumberは整数と小数の両方を扱います。大きな整数用のBigIntなどもありますが、この回では使いません。

typeofで確認する

console.log(typeof 18);
console.log(typeof "18");
console.log(typeof true);
console.log(typeof undefined);

順にnumber、string、boolean、undefinedです。

ただしtypeof nullは歴史的な理由で"object"を返します。nullかどうかを調べたい場合はvalue === nullを使います。typeofだけで全部を判別できると思わないことがポイントです。MDNの文法とデータ型でも確認できます。

4. テンプレートリテラルで、文章へ値を入れる

const name = "Aoi";
const score = 80;

console.log(`${name}さんは${score}点です`);

表示はAoiさんは80点ですです。

ここではダブルクォーテーションではなく、バッククォートという記号で囲みます。その中の${score}の位置へ、変数の値が入ります。この書き方がテンプレートリテラルです。

"Aoiさんは" + score + "点です"のように連結もできますが、変数が複数ある文章ではテンプレートリテラルが読みやすくなります。

"${score}点"と普通の引用符で囲むと、変数の値に置き換わらず、その記号が文字として出ます。うまく表示されなければ、まず両端の記号を見ましょう。

5. 計算は、小さな例で結果を確かめる

記号 意味 例
+ 足し算 7 + 2 → 9
- 引き算 7 - 2 → 5
* 掛け算 7 * 2 → 14
/ 割り算 7 / 2 → 3.5
% 余り 7 % 2 → 1
** べき乗 7 ** 2 → 49

JavaScriptのnumber同士なら、7 / 2は3.5です。CやC++のint同士の割り算と混同しないようにしましょう。

掛け算は足し算より先です。(100 + 50) * 3なら、かっこの中を先に計算するので450になります。

小数はぴったり保存できない場合がある

0.1 + 0.2は、一般的なJavaScript環境で0.30000000000000004になります。numberが小数を近似して扱うためです。

円単位の練習なら整数で扱うと、このずれを避けやすくなります。ただし整数も無制限ではなく、正確に扱える範囲には限りがあります。

6. 入力した数字は、まず文字列として来る

ブラウザのpromptは、入力欄を表示して文字列を受け取る機能です。キャンセルするとnullになります。

const input = prompt("個数を入力してください");

if (input === null || input.trim() === "") {
  console.log("入力を中止しました");
} else {
  const count = Number(input);

  if (Number.isInteger(count) && count >= 0 && count <= 100) {
    console.log(`次は${count + 1}個です`);
  } else {
    console.log("0から100の整数を入力してください");
  }
}

3を入力すると、次は4個ですと表示されます。promptはブラウザ用なので、Node.jsで同じ例をそのまま動かしてもpromptは標準では使えません。

ifは次回で学びます。ここでは「入力を確認してから計算する」流れを見てください。

Numberは、失敗したらどうなる?

Number("5")は数値5ですが、Number("abc")はNaNになります。NaNは数値として表せない結果を示す特別な値です。

さらにNumber("")やNumber(null)は0です。だから先に空欄とキャンセルを分けているんですね。trim()は前後の空白を取り除く文字列の操作です。

小数も受け付ける入力ならNumber.isFiniteで有限な数か確認します。今回は個数なのでNumber.isIntegerを使っています。MDNの有限数の確認も参考になります。

7. 練習:商品の合計金額を文章で表示する

価格350円、個数3個として、テンプレートリテラルで合計を表示してください。

模範解答

const price = 350;
const quantity = 3;
const total = price * quantity;

console.log(`合計金額は${total}円です`);

解説

350 × 3でtotalは1050になり、合計金額は1050円ですと出ます。途中で再代入しないため、3つともconstです。

個数だけを4へ変えた場合の答えは1400円です。ファイルを変更して再実行すれば計算し直しますが、すでに計算したtotalがあとから自動で更新される仕組みではありません。

値の種類が怪しいときは、console.log(typeof quantity);で確認しましょう。文字列の"3"を使って偶然掛け算できても、暗黙の変換へ頼らず、数として扱う値は明示的にそろえる方が安心です。

次の一歩

変数は「名前の付いた値」、型は「その値の種類」、代入は「右で求めた値を左へ入れる操作」です。この3つを分けると、予想外の計算結果も調べやすくなります。

前の記事 / 次の記事:if文

← 記事一覧へ戻る