TypeError: can't assign to property "x" on "y": not an object

JavaScript の strict モードの例外 "can't assign to property" は、プリミティブ値、例えばシンボル文字列数値論理値などにプロパティを作成しようとしたときに発生します。プリミティブ値はいかなるプロパティを持つこともできません。

エラーメッセージ

js
TypeError: can't assign to property "x" on {y}: not an object (Firefox)
TypeError: Cannot create property 'x' on {y} (Chrome)

エラーの種類

エラーの原因

Strict モードでは、 TypeErrorプリミティブ値、例えばシンボル文字列数値論理値などにプロパティを作成しようとしたときに発生します。プリミティブ値はいかなるプロパティを持つこともできません。

想定外の場所に想定外の値が流れてきたり、 StringNumber のオブジェクトバリアントが想定されていたりすることが問題となることがあります。

無効な場合

js
"use strict";

var foo = "my string";
// 次の行は strict モードでない場合は何もしません。
foo.bar = {}; // TypeError: can't assign to property "bar" on "my string": not an object

問題の修正

このような場所でプリミティブ値を使用しないようにコードを修正するか、 Object と同等のオブジェクトを生成して問題を修正するかします。

js
"use strict";

var foo = new String("my string");
foo.bar = {};

関連情報