代入演算子 (=)
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
代入 (=
) 演算子は、変数またはプロパティに値を代入するために使用されます。代入式自体の値は、代入された値になります。これにより、複数の変数に 1 つの値を代入するために、複数の代入を連鎖させることができます。
試してみましょう
let x = 2;
const y = 3;
console.log(x);
// 予想される出力: 2
console.log((x = y + 1)); // 3 + 1
// 予想される出力: 4
console.log((x = x * y)); // 4 * 3
// 予想される出力: 12
構文
x = y
引数
x
-
有効な代入対象であり、識別子またはプロパティアクセサーなどです。構造分解パターンも使用できます。
y
-
x
に代入する値を指定する式です。
返値
y
の値です。
例外
ReferenceError
-
厳格モードで、スコープ内で宣言されていない識別子に代入した場合に発生します。
TypeError
-
厳格モードで、変更不可能なプロパティに代入した場合に発生します。
解説
代入演算子は、以下のような他の場所で、構文の区切り文字として使用される等号 (=
) とは完全に異なります。
これらの場所はすべて、=
の右側に代入式を受け入れます。したがって、複数の等号が連なっている場合は、次のように指定します。
const x = y = 5;
これは次のものと同等です。
const x = (y = 5);
これは、 y
は既存の変数である必要があり、 x
は新しく宣言された const
変数であることを意味しています。 y
には値 5
が代入され、 x
は y = 5
の式(この値も 5
)の値で初期化されます。 y
が既存の変数でない場合、厳格モードでない場合はグローバル変数 y
が暗黙的に作成されます。厳格モードでは、 ReferenceError
が発生します。同じ宣言内で 2 つの変数を宣言するには、次のようにします。
const x = 5,
y = 5;
例
基本的な代入と連鎖
let x = 5;
let y = 10;
let z = 25;
x = y; // x is 10
x = y = z; // x, y and z are all 25
代入式の値
代入式自体は右辺値として評価されるため、値のログ出力と変数への代入を同時に行うことができます。
let x;
console.log(x); // undefined
console.log(x = 2); // 2
console.log(x); // 2
修飾されていない識別子への代入
グローバルオブジェクトは、スコープチェーンの最上位に位置します。名前を値に解決しようとすると、スコープチェーンが検索されます。つまり、グローバルオブジェクトのプロパティは、globalThis.
、window.
、global.
で名前を修飾しなくても、すべてのスコープから簡単に参照できるということです。
グローバルオブジェクトに String
プロパティ (Object.hasOwn(globalThis, "String")
) があるため、次のコードを使用することができます。
function foo() {
String("s"); // `String` 関数はグローバルで利用可能
}
したがって、最終的にはグローバルオブジェクトが、修飾されていない識別子が検索されます。globalThis.String
と入力する必要はありません。修飾されていない String
と入力するだけで済みます。この機能の概念の一貫性を高めるため、修飾されていない識別子への代入は、スコープチェーンに同じ名前の変数が宣言されていない場合、グローバルオブジェクトにその名前のプロパティを作成することを想定します(globalThis.
は省略されます)。
foo = "f"; // 厳格モードでない場合は、グローバルオブジェクトに `foo` という名前付きのプロパティを作成すると想定します。
Object.hasOwn(globalThis, "foo"); // true
厳格モードでは、厳格モードで修飾されていない識別子に代入すると、グローバルオブジェクトにプロパティが誤って作成されるのを避けるため、 ReferenceError
が発生します。
なお、上記のことは、よく誤解されていることとは逆に、JavaScript には暗黙の変数や未宣言の変数はないことを意味します。 JavaScript は、グローバルオブジェクトとグローバルスコープを統合し、プロパティの作成時にグローバルオブジェクトの修飾子を省略できるようにしているだけです。
構造分解を伴う代入
左辺は代入パターンにすることもできます。これにより、複数の変数に一度に代入することができます。
const result = /(a+)(b+)(c+)/.exec("aaabcc");
let a = "",
b = "",
c = "";
[, a, b, c] = result;
console.log(a, b, c); // "aaa" "b" "cc"
詳しくは、構造分解を参照してください。
仕様書
Specification |
---|
ECMAScript® 2026 Language Specification # sec-assignment-operators |