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

View in English Always switch to English

SyntaxError: invalid assignment left-hand side

JavaScript の例外 "invalid assignment left-hand side" は、どこかで予想外の代入が行われたときに発生します。例えば、単一の = の記号が ===== の代わりに使用された場合です。

エラーメッセージ

SyntaxError: Invalid left-hand side in assignment (V8-based)
SyntaxError: invalid assignment left-hand side (Firefox)
SyntaxError: Left side of assignment is not a reference. (Safari)

ReferenceError: Invalid left-hand side in assignment (V8-based)
ReferenceError: cannot assign to function call (Firefox)
ReferenceError: Left side of assignment is not a reference. (Safari)

エラー型

構文によって、SyntaxError または ReferenceError になります。

エラーの原因

どこかに予想外の代入があります。たとえば、代入演算子等値演算子が合っていないからかもしれません。 = 記号が 1 つの場合は変数に値を代入する一方、===== 演算子は値を比較します。

よくある無効な代入

js
if (Math.PI + 1 = 3 || Math.PI + 1 = 4) {
  console.log("no way!");
}
// SyntaxError: invalid assignment left-hand side

const str = "Hello, "
+= "is it me "
+= "you're looking for?";
// SyntaxError: invalid assignment left-hand side

if 文では、等価演算子 (===) が必要ですし、文字連結にはプラス (+) 演算子が必要です。

js
if (Math.PI + 1 === 3 || Math.PI + 1 === 4) {
  console.log("no way!");
}

const str = "Hello, "
  + "from the "
  + "other side!";

ReferenceError が発生する代入

不正な代入が常に構文エラーを引き起こすとは限りません。構文がほぼ正しい場合でも、実行時に左辺の式が参照ではなく値として評価されてしまうため、代入が無効となる場合があります。このようなエラーは、文が実際に実行される段階になって初めて発生します。

js
function foo() {
  return { a: 1 };
}
foo() = 1; // ReferenceError: invalid assignment left-hand side

関数呼び出し、new の呼び出し、super()this は、どれも参照ではなく値です。これらを左辺で使用したい場合は、代入先の対象を、それらが生成する値のプロパティにする必要があります。

js
function foo() {
  return { a: 1 };
}
foo().a = 1;

メモ: Firefox と Safari では、最初の例は厳格モード以外では ReferenceError が、厳格モード では SyntaxError が発生します。Chrome では、厳格モードであるかを問わず、実行時に ReferenceError が発生します。

代入先としてオプションチェーンを使用する

オプションチェーンは、代入の有効な対象ではありません。

js
obj?.foo = 1; // SyntaxError: invalid assignment left-hand side

その代わりに、まず null 値の場合への対処が必要です。

js
if (obj) {
  obj.foo = 1;
}

関連情報