JavaScript を学び始める人向けに、「文法とデータ型」を噛み砕いて説明する。まず全体の構成を押さえて、それぞれの要素(文法、変数宣言、データ型、リテラルなど)を順番に見ていく。
全体構成と目的
この章「文法とデータ型」は、JavaScript を書くうえでの 基本ルール を紹介してくれている。
たとえば、どんな書き方ができて、どのようなデータ(数とか文字とか)があって、それをどう表現するか、という “土台” の部分。
この知識がないと、コードを書いても「何で動かないんだ?」と迷いやすいから、最初にしっかり理解したいところ。
主な内容は:
- コメント、空白などの扱い
- 変数の宣言(
var,let,const) - スコープ(変数の有効範囲)
- データ型(プリミティブ型・オブジェクト型)
- 型変換(JavaScript が内部で自動で型を変える現象)
- 各種リテラル(文字列、数値、配列、オブジェクトなどの記法)
順番に見ていこう。
コメントと空白
コードを読みやすくするために、プログラムとして実行されない「コメント」を使える。JavaScript のコメントの書き方は C や Java と似てる。
// 一行コメント
/* 複数行コメント … */JavaScriptまた、空白文字(スペース、タブ、改行など)は基本的には無視される(トークンの区切りとして使われる)けど、コードの意味を変える場合もあるから、適度に使おう。
変数宣言:var, let, const
プログラムの中で値を記憶するために「変数」という箱を使う。その箱を作る(宣言する)方法が JavaScript には複数ある。
識別子(変数名)のルール
変数名には以下のルールがある(識別子とも呼ぶ):
- 文字、アンダースコア(_)、ドル記号($)で始める
- その後は数字も使える
- 大文字・小文字は区別される
- Unicode 文字なども使える(ただし可読性との兼ね合いで注意)
例:myVar, _temp, $value, ユーザー名(Unicode を使った例)など。
宣言方法と違い
主な宣言方法は次の 3 つ。
var
古くから使われてきた宣言方法。関数スコープ(関数の中で宣言するとその関数内で有効)をもつ。varで宣言された変数は「巻き上げ(hoisting)」という振る舞いをする(後で説明)。let
ES6(近年の JavaScript 標準仕様)で導入された。ブロックスコープ({ }で囲まれた範囲。たとえば if 文や for 文の中など)を持つ。const
“定数” 宣言。宣言時に一度だけ値を設定でき、それ以後の再代入はできない。スコープはletと同じくブロック単位。
例:
let a = 10;
a = 20; // OK
const b = 30;
b = 40; // エラーになる
var c = 5;
JavaScriptvar による変数と let / const の変数ではスコープの扱いが異なるので、最近は let と const を使うことが推奨されてることが多い。
スコープ(有効範囲)
- グローバルスコープ:変数を関数やブロックの外で宣言すれば、どこからでもアクセスできる。
- 関数スコープ:関数内で
varによって宣言された変数は、その関数内部でのみ有効。 - ブロックスコープ:
letやconstで宣言された変数は、その変数が宣言された{}ブロック内でのみ有効。
例:
if (true) {
let x = 100;
}
console.log(x); // ReferenceError: x is not defined
JavaScript上の例では x は if ブロックの中でしか使えない。
ただし、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ただし、let や const では「一時的な死のゾーン(TDZ: Temporal Dead Zone)」という概念があり、宣言前にアクセスするとエラーになる。
データ型(型、タイプ)
JavaScript には複数のデータ型(型)があって、それぞれ扱い方が異なる。最新の仕様で以下のように分類されている。
プリミティブ型(値そのものを持つ)
JavaScript の基本となる型(プリミティブ型)は 7 つ:
- 論理型(Boolean):
trueまたはfalse null:意図的に「値なし」を表すundefined:値が未定義であることを表す- 数値型(Number):整数や小数
- 長整数型(BigInt):非常に大きな整数を扱う型(末尾に
nをつける記法など) - 文字列型(String):テキスト
- シンボル型(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 進数)など - 文字列リテラル:シングルクオート
'…'またはダブルクオート"…"、またはテンプレートリテラル`…` - 論理値リテラル:
true、false - 配列リテラル:角括弧
[...]で要素を列挙 - オブジェクトリテラル:波括弧
{ 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注意ポイント・よく混乱するところ
いくつか初心者がよくつまづくポイントも紹介する。
varvslet/const:varはスコープが広すぎて意図しない動作を起こしやすいから、可能な限りlet/constを使うのがベストプラクティス。- 再代入と不変性:
constは変数そのものへの再代入を禁止するけど、その変数が参照するオブジェクトの中身を変えることはできる(プロパティを変更するなど)。 - 自動型変換の罠:
==(等価演算子)を使うと型変換が働くので予期せぬ結果になることがある。できれば===(厳密等価)を使用して、型も値も一致するかをチェックするのが安全。 - 巻き上げの理解:
var宣言の巻き上げ、let/constの「一時的な死のゾーン」などの概念は、コードを読むときに「宣言が実際どのタイミングで有効になるか」を誤解しないように重要。
