JavaScript | 第2章「文法とデータ型」

javascrpit JavaScript
スポンサーリンク

JavaScript を学び始める人向けに、「文法とデータ型」を噛み砕いて説明する。まず全体の構成を押さえて、それぞれの要素(文法、変数宣言、データ型、リテラルなど)を順番に見ていく。

全体構成と目的

この章「文法とデータ型」は、JavaScript を書くうえでの 基本ルール を紹介してくれている。
たとえば、どんな書き方ができて、どのようなデータ(数とか文字とか)があって、それをどう表現するか、という “土台” の部分。

この知識がないと、コードを書いても「何で動かないんだ?」と迷いやすいから、最初にしっかり理解したいところ。

主な内容は:

  • コメント、空白などの扱い
  • 変数の宣言(var, let, const
  • スコープ(変数の有効範囲)
  • データ型(プリミティブ型・オブジェクト型)
  • 型変換(JavaScript が内部で自動で型を変える現象)
  • 各種リテラル(文字列、数値、配列、オブジェクトなどの記法)

順番に見ていこう。

コメントと空白

コードを読みやすくするために、プログラムとして実行されない「コメント」を使える。JavaScript のコメントの書き方は C や Java と似てる。

// 一行コメント
/* 複数行コメント … */
JavaScript

また、空白文字(スペース、タブ、改行など)は基本的には無視される(トークンの区切りとして使われる)けど、コードの意味を変える場合もあるから、適度に使おう。

変数宣言:var, let, const

プログラムの中で値を記憶するために「変数」という箱を使う。その箱を作る(宣言する)方法が JavaScript には複数ある。

識別子(変数名)のルール

変数名には以下のルールがある(識別子とも呼ぶ):

  • 文字、アンダースコア(_)、ドル記号($)で始める
  • その後は数字も使える
  • 大文字・小文字は区別される
  • Unicode 文字なども使える(ただし可読性との兼ね合いで注意)

例:myVar, _temp, $value, ユーザー名(Unicode を使った例)など。

宣言方法と違い

主な宣言方法は次の 3 つ。

  1. var
    古くから使われてきた宣言方法。関数スコープ(関数の中で宣言するとその関数内で有効)をもつ。
    var で宣言された変数は「巻き上げ(hoisting)」という振る舞いをする(後で説明)。
  2. let
    ES6(近年の JavaScript 標準仕様)で導入された。ブロックスコープ( { } で囲まれた範囲。たとえば if 文や for 文の中など)を持つ。
  3. const
    “定数” 宣言。宣言時に一度だけ値を設定でき、それ以後の再代入はできない。スコープは let と同じくブロック単位。

例:

let a = 10;
a = 20;  // OK

const b = 30;
b = 40;  // エラーになる

var c = 5;
JavaScript

var による変数と let / const の変数ではスコープの扱いが異なるので、最近は letconst を使うことが推奨されてることが多い。

スコープ(有効範囲)

  • グローバルスコープ:変数を関数やブロックの外で宣言すれば、どこからでもアクセスできる。
  • 関数スコープ:関数内で var によって宣言された変数は、その関数内部でのみ有効。
  • ブロックスコープletconst で宣言された変数は、その変数が宣言された {} ブロック内でのみ有効。

例:

if (true) {
  let x = 100;
}
console.log(x);  // ReferenceError: x is not defined
JavaScript

上の例では xif ブロックの中でしか使えない。

ただし、var を使った場合:

if (true) {
  var y = 200;
}
console.log(y);  // 正しく表示される(200)
JavaScript

これは var にはブロック単位のスコープがないため。

巻き上げ(Hoisting)

var で宣言された変数は、その関数やグローバルスコープの先頭に「宣言だけが持ち上げられた」ように扱われる。つまり宣言前にアクセスしても undefined が返る、という振る舞い。

console.log(a);  // undefined(エラーにはならない)
var a = 10;
JavaScript

このコードは内部的には下のように扱われると考えられる:

var a;
console.log(a);  // undefined
a = 10;
JavaScript

ただし、letconst では「一時的な死のゾーン(TDZ: Temporal Dead Zone)」という概念があり、宣言前にアクセスするとエラーになる。

データ型(型、タイプ)

JavaScript には複数のデータ型(型)があって、それぞれ扱い方が異なる。最新の仕様で以下のように分類されている。

プリミティブ型(値そのものを持つ)

JavaScript の基本となる型(プリミティブ型)は 7 つ:

  1. 論理型(Boolean)true または false
  2. null:意図的に「値なし」を表す
  3. undefined:値が未定義であることを表す
  4. 数値型(Number):整数や小数
  5. 長整数型(BigInt):非常に大きな整数を扱う型(末尾に n をつける記法など)
  6. 文字列型(String):テキスト
  7. シンボル型(Symbol):一意な識別子として使う型

そして、もう一つ重要な型が:

  • オブジェクト型(Object):複数の値をまとめたり、複雑なデータを扱うのに使う。関数もオブジェクトの一種。

つまり、JavaScript で扱う値は、「プリミティブかオブジェクトか」に大きく分かれる。

型変換(自動変換:型キャスト)

JavaScript は「動的型付け言語」だから、変数を宣言するときに型を決める必要はなく、値を代入するたびに型が変わることもある。

例:

let x = 42;          // 数値
x = "こんにちは";    // 文字列(型が変わる)
JavaScript

典型的な挙動の例として、+ 演算子(足し算/文字列結合)がある:

"答えは " + 42       // => "答えは 42"(数値を文字列に変換して結合)
42 + " が答え"       // => "42 が答え"
"37" + 7             // => "377"(文字列結合になる)
JavaScript

一方、他の算術演算子(-, * など)は、文字列を数値に変換して計算することもある:

"37" - 7     // => 30(文字列 "37" を数値 37 に変換してから引き算)
"37" * 7     // => 259
JavaScript

文字列を数値に変換するには、parseInt()parseFloat() といった関数を使える。

また、+ 演算子の単項演算子として使うと、文字列を数値に変換してくれることもある:

+"123.45"    // => 123.45(文字列から数値に変換)
JavaScript

リテラル(値を直接書く記法)

プログラム内に値を直接書く方法をリテラルという。以下のような種類がある。MDN Web Docs

  • 数値リテラル:例 123, 3.14, 0xFF(16進数), 0b101(2 進数)など
  • 文字列リテラル:シングルクオート '…' またはダブルクオート "…"、またはテンプレートリテラル `…`
  • 論理値リテラルtruefalse
  • 配列リテラル:角括弧 [...] で要素を列挙
  • オブジェクトリテラル:波括弧 { key: value, … } でプロパティを並べる
  • 正規表現リテラル:スラッシュ /…/ で囲む形式

リテラルの例

// 数値
123
3.14
0xff

// 文字列
"hello"
'world'
`こんにちは ${name}`   // テンプレートリテラル

// 論理
true
false

// 配列
[1, 2, 3, "four"]

// オブジェクト
{ name: "Alice", age: 30 }

// 正規表現
/ab+c/
JavaScript

テンプレートリテラルは、変数や式を ${…} で埋め込めて便利。たとえば:

const name = "Taro";
`こんにちは、${name} さん!`
JavaScript

注意ポイント・よく混乱するところ

いくつか初心者がよくつまづくポイントも紹介する。

  • var vs let/constvar はスコープが広すぎて意図しない動作を起こしやすいから、可能な限り let / const を使うのがベストプラクティス。
  • 再代入と不変性const は変数そのものへの再代入を禁止するけど、その変数が参照するオブジェクトの中身を変えることはできる(プロパティを変更するなど)。
  • 自動型変換の罠==(等価演算子)を使うと型変換が働くので予期せぬ結果になることがある。できれば ===(厳密等価)を使用して、型も値も一致するかをチェックするのが安全。
  • 巻き上げの理解var 宣言の巻き上げ、let / const の「一時的な死のゾーン」などの概念は、コードを読むときに「宣言が実際どのタイミングで有効になるか」を誤解しないように重要。
タイトルとURLをコピーしました