このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

JavaScript 言語概要

JavaScript はマルチパラダイムの動的言語であり、型や演算子、標準組み込みオブジェクト、メソッドがあります。その構文は Java や C 言語に由来するので、それらの言語の多くの構造が JavaScript にも同様に適用できます。 JavaScript は、オブジェクトプロトタイプやクラスによるオブジェクト指向プログラミングに対応しています。また、JavaScript は関数型プログラミングもサポートします。関数が第一級オブジェクトであり、式から容易に作成し、他のオブジェクトと同じように受け渡しすることができます。

このページは、 JavaScript のさまざまな言語機能の概要で、 C や Java など、他の言語のバックグラウンドがある読者のために書かれたものです。

データ型

まずはあらゆる言語の構成要素、「型」を見ることから始めましょう。 JavaScript のプログラムは値を操作し、それらの値はすべて型に属しています。JavaScript の型は次の通りです。

  • 数値型: 非常に大きな整数を除くすべての数値(整数、浮動小数点数)で使用します。
  • 長整数型: 任意の長さの大きな整数に使用します。
  • 文字列型: テキストを格納するために使用されます。
  • 論理型: truefalse - 通常は条件の論理に使用します。
  • シンボル型: 衝突しない固有の識別子を作成するために使用します。
  • Undefined: 変数に値が割り当てられていないことを示します。
  • Null: 意図的に値がないことを示します。

他のすべてのものはオブジェクト型と呼ばれます。主なオブジェクト型には次のものがあります。

JavaScript では、関数は特別なデータ構造ではありません。呼び出すことができるオブジェクトの特別な型にすぎません。

数値

JavaScript には 2 つの組み込み数値型があります。 数値型 (Number) と 長整数型 (BigInt) です。

数値型はIEEE 754 倍精度 64 ビットバイナリー値です。これは整数の場合は-(253 − 1)253 − 1 の間の数ならば精度が落ちることがなく、浮動小数点数は 1.79 × 10308 まで格納できます。 JavaScript では、数値型の中で浮動小数点数と整数を区別しません。

js
console.log(3 / 2); // 1.5, 1 ではない

つまり、整数のように見えるものは、実は暗黙のうちに浮動小数点です。 IEEE 754 のエンコード方式では、浮動小数点数で演算が不正確になることがあります。

js
console.log(0.1 + 0.2); // 0.30000000000000004

ビット演算など整数を想定した処理を行う場合、数値は 32 ビット整数に変換されます。

数値リテラルには、基数(2 進数、8 進数、10 進数、16 進数)を示す接頭辞や、指数接尾辞もあります。

js
console.log(0b111110111); // 503
console.log(0o767); // 503
console.log(0x1f7); // 503
console.log(5.03e2); // 503

長整数型は任意の長さの整数です。その動作は C の整数型に似ていますが (例えば除算は 0 で切り捨てられます)、無限に大きくなることができます。長整数型は数値リテラルと接尾辞 n で指定します。

js
console.log(-3n / 2n); // -1n

標準の算術演算子は、加算、減算、剰余演算などを含めて対応しています。長整数型と数値型を混合して演算処理を行うことはできません。

Math オブジェクトは、標準数学関数と定数を提供します。

js
Math.sin(3.5);
const circumference = 2 * Math.PI * r;

文字列を数値に変換する方法は 3 つあります。

  • parseInt() は、文字列を整数として解釈します。
  • parseFloat() は、文字列を浮動小数点数として解釈します。
  • Number() 関数は、 文字列を数値リテラルであるかのように解釈でき、さまざまな数値表現に対応しています。

また、単項 +Number() の短縮形として使用することもできます。

数値の値には、 NaN ("Not a Number" の略)と Infinity も含みます。例えば、数値以外の文字列を解釈しようとした場合や、負の値に対して Math.log() を使用した場合など、多くの「不正な演算」は NaN を返します。ゼロによる除算は Infinity (正の値または負の値)を返します。

NaN は伝染します。どんな数学処理にもオペランドとして提供すると、結果も NaN になります。 NaN は JavaScript で唯一それ自身と等しくない値です(IEEE 754 仕様による)。

文字列

JavaScript での文字列は Unicode 文字の列です。これは国際化に携わったことのある人にとっては歓迎すべきニュースでしょう。より正確な言い方をすれば、文字列は UTF-16 エンコード方式です。

js
console.log("Hello, world");
console.log("你好,世界!"); // ほぼすべての Unicode 文字は文字列リテラルで書くことができます。

文字列は一重引用符でも二重引用符でも書くことができます。 JavaScript には文字と文字列の区別はありません。単一の文字を表したい場合は、その単一の文字からなる文字列を使用するだけです。

js
console.log("Hello"[1] === "e"); // true

文字列の長さ(コード単位)を調べるには、そのlengthプロパティにアクセスします。

文字列には、文字列を操作したり、文字列に関する情報にアクセスしたりするための ユーティリティメソッドがあります。設計上、すべてのプリミティブは不変なので、これらのメソッドは新しい文字列を返します。

演算子 + は文字列に対してオーバーロードされています。演算子の 1 つが文字列の場合、数値の加算の代わりに文字列の連結を行います。特別なテンプレートリテラル構文により、式を埋め込んだ文字列をより簡潔に書くことができます。 Python の f-strings や C# の補完文字列とは異なり、テンプレートリテラルは(単一引用符や二重引用符ではなく)逆引用符を使用します。

js
const age = 25;
console.log("私は " + age + " 歳です。"); // 文字列へ変換
console.log(`私は ${age} 歳です。`); // テンプレートリテラル

その他の型

JavaScript では、意図的に値がないことを示す nullnull のキーワードでのみアクセスできます)と、値がないことを示す undefined を区別します。 undefined を取得する方法はたくさんあります。

  • return 文に値がない場合 (return;) は、暗黙に undefined を返します。
  • 存在しないオブジェクトのプロパティへアクセスすると (obj.iDontExist)、 undefined を返します。
  • 初期化を伴わない変数宣言 (let x;) は、暗黙のうちにその変数を undefined に初期化します。

JavaScript には truefalse (これらはともにキーワードです)を取りうる値とする論理型があります。どんな値でも以下の規則に基づいて論理値に変換できます。

  1. false0、空文字列 ("")、NaNnullundefined は、すべて false になる。
  2. その他の値はすべて true になる。

Boolean() 関数を使うことで、明示的にこの変換を行うことができます。

js
Boolean(""); // false
Boolean(234); // true

しかし、これはほとんど必要ありません。 JavaScript は、 if 文の中など(制御構造を参照)のように論理値が期待される場面では、暗黙にこの変換を行うからです。このため、ときどき "真値 (truthy)" および "偽値 (falsy)" と言うことがありますが、これは論理値に変換されるときにそれぞれ true または false になる値という意味です。

&& (論理 AND) や || (論理 OR)、! (論理 NOT) などの論理演算がサポートされています。演算子を参照してください。

シンボル (Symbol) 型は固有の識別子を作成するために多く使用されます。 Symbol() 関数で作成するシンボルは固有のものであることが保証されています。さらに、共有定数である登録シンボルや、特定の演算を実行するための「プロトコル」として言語が利用する公知のシンボルがあります。シンボルリファレンスで詳しく説明されています。

変数

JavaScript では、新しい変数を宣言するのに