この記事ではJavaScriptで発生する『Cannot set properties of undefined』や『Cannot set properties of null』というエラーの原因と解決策について、以下の内容をサンプルコードを用いてわかりやすく解説します。ご参考になれば幸いです。
Cannot set properties of undefined/null
エラーとはCannot set properties of undefined/null
エラーの原因と解決方法- 未定義(
undefined
)のオブジェクトにプロパティを設定する null
値のオブジェクトにプロパティを設定する- 未定義(
undefined
)の配列の要素に値を設定する null
値の配列の要素に値を設定する- 存在しないDOM要素にプロパティを設定する
- 未定義(
「Cannot set properties of undefined/null」エラーとは
Cannot set properties of undefined/null
エラーは、「未定義(undefined
)やnull
のオブジェクトに対してプロパティを設定した時」や「未定義(undefined
)やnull
の配列の要素に対して値を設定した時」に発生するエラーです。
例えば、以下のサンプルコードでは、未定義(undefined
)のobj
オブジェクトに対してname
プロパティを設定しようとしています。
const obj = undefined; // objオブジェクトは未定義(undefined)である
obj.name = 'Taro';
// 以下のエラー発生
// Uncaught TypeError: Cannot set properties of undefined (setting 'name')
上記のサンプルコードを実行すると、Cannot set properties of undefined (setting 'name')
というエラーが発生します。このエラーを直訳すると以下の意味になります。
未定義(undefined
)のプロパティにセットすることができません(setting 'name')
ただし、ニュアンス的には以下が正しいです。
未定義(undefined
)のオブジェクトにname
プロパティを設定できない
obj
オブジェクトに対してname
プロパティを設定しようとしたが、obj
オブジェクトは未定義(undefined
)なのでこのエラーが発生しているのですね。
「Cannot set properties of undefined/null」エラーの原因と解決方法
Cannot set properties of undefined/null
エラーは以下の原因で発生します。
- 未定義(
undefined
)のオブジェクトにプロパティを設定する null
値のオブジェクトにプロパティを設定する- 未定義(
undefined
)の配列の要素に値を設定する null
値の配列の要素に値を設定する- 存在しないDOM要素にプロパティを設定する
ではこれから、各原因についてサンプルコードを用いてわかりやすく説明します。また、各原因の解決方法についても説明します。
原因1: 未定義(undefined
)のオブジェクトにプロパティを設定する
以下のサンプルコードでは、未定義(undefined
)のobj
オブジェクトに対してname
プロパティを設定しようとしています。
const obj = undefined; // objオブジェクトは未定義(undefined)である
obj.name = 'Taro';
// 以下のエラー発生
// Uncaught TypeError: Cannot set properties of undefined (setting 'name')
上記のサンプルコードを実行すると、Cannot set properties of undefined (setting 'name')
というエラーが発生します。
原因2: null
値のオブジェクトにプロパティを設定する
以下のサンプルコードでは、null
値のobj
オブジェクトに対してname
プロパティを設定しようとしています。
const obj = null; // objオブジェクトはnull値である
obj.name = 'Taro';
// 以下のエラー発生
// Uncaught TypeError: Cannot set properties of null (setting 'name')
上記のサンプルコードを実行すると、Cannot set properties of null (setting 'name')
というエラーが発生します。
「原因1」と「原因2」の解決方法
オブジェクトを使用する前に、適切に初期化することでエラーを防ぐことができます。
const obj = {}; // 空のオブジェクトとして初期化
obj.name = 'Taro'; // 問題なく動作
console.log(obj.name); // ログ出力: Taro
補足
オブジェクトが定義されているが、特定のプロパティがない場合にはエラーは発生しません。
const obj = { data: 'Taro' }; // nameプロパティはない
obj.name = 'Taro'; // 問題なく動作
console.log(obj.name); // ログ出力: Taro
上記のサンプルコードでは、obj
オブジェクトは定義されていますがname
プロパティは存在しません。この場合、エラーは発生せず、問題なく動作します。
また、オブジェクト型ではない型で定義されている場合にもエラーは発生しません。この場合、エラーは発生せず、undefined
が出力されます。
const obj = 'hogehoge'; // objはオブジェクトではない
obj.name = 'Taro'; // 問題なく動作
console.log(obj.name); // ログ出力: Undefined
原因3: 未定義(undefined
)の配列の要素に値を設定する
以下のサンプルコードでは、未定義(undefined
)の配列arr
の配列の要素に対して値を設定しようとしています。
const arr = undefined; // 配列arrは未定義(undefined)である
arr[0] = 1;
// 以下のエラー発生
// Uncaught TypeError: Cannot set properties of undefined (setting '0')
上記のサンプルコードを実行すると、Cannot set properties of undefined (setting '0')
というエラーが発生します。配列arr
の0番目の要素arr[0]
に値を設定ようとしたが、配列arr
は未定義(undefined
)なのでこのエラーが発生しているのですね。
原因4: null
値の配列の要素に値を設定する
以下のサンプルコードでは、null
値の配列arr
の配列の要素に対して値を設定しようとしています。
const arr = null; // 配列arrはnull値である
arr[0] = 1;
// 以下のエラー発生
// Uncaught TypeError: Cannot set properties of null (setting '0')
上記のサンプルコードを実行すると、Cannot set properties of null (setting '0')
というエラーが発生します。
「原因3」と「原因4」の解決方法
配列を使用する前に、適切に初期化することでエラーを防ぐことができます。
let arr = []; // 空の配列として初期化
arr[0] = 1; // 問題なく動作
console.log(arr); // ログ出力: [ 1 ]
補足
配列が定義されているが、特定の要素がない場合にはエラーは発生しません。
let arr = [1, 2, 3]; // 要素は3つしかない
arr[10] = 1; // 問題なく動作
console.log(arr); // ログ出力: [ 1, 2, 3, <7 empty items>, 1 ]
上記のサンプルコードでは、配列arr
は定義されていますが10番目の要素arr[10]
は存在しません。この場合、エラーは発生せず、問題なく動作します。
また、配列ではなく、文字列や数値型で定義されている場合もエラーは発生しません。
const arr = 'hogehoge'; // arrは配列ではない
arr[10] = 1; // 問題なく動作
console.log(arr); // ログ出力: 'hogehoge'
原因5: 存在しないDOM要素にプロパティを設定する
JavaScriptでDOM(ドキュメントオブジェクトモデル)を操作する際にもCannot set properties of undefined/null
エラーが発生することがあります。主に以下の原因で発生します。
- アクセスしたいDOM要素が存在しない
- 指定したIDやクラス名を持つDOM要素がHTMLドキュメント内に存在しない場合、
getElementById
やquerySelector
などのメソッドはnull
を返します。その結果、これらの要素のプロパティに値を設定するとエラーが発生します。
- 指定したIDやクラス名を持つDOM要素がHTMLドキュメント内に存在しない場合、
- DOM要素が読み込まれる前にDOM要素にアクセスする
- JavaScriptがHTMLの構造を読み込む前に実行されている場合(例えば、
<script>
タグが<body>
要素の上部にある場合)、getElementById
やquerySelector
などのメソッドはnull
を返します。その結果、これらの要素のプロパティに値を設定するとエラーが発生します。
- JavaScriptがHTMLの構造を読み込む前に実行されている場合(例えば、
以下のサンプルコードでは、id
が002
の要素を参照していますが、HTML内にはid
が001
の要素しか存在しないため、getElementById('002')
はnull
を返します。その結果、null
のtextContent
プロパティに値を設定しようとしてCannot set properties of null (setting 'textContent')
というエラーが発生します。
<!DOCTYPE html>
<html>
<body>
<h1 id="001">Hello</h1>
<script>
const element = document.getElementById('002');
element.textContent = 'hogehoge'; // エラー発生
// 以下のエラー発生
// Uncaught TypeError: Cannot set properties of null (setting 'textContent')
</script>
</body>
</html>
このエラーを修正するためには、正しいid
を参照するか、HTMLに対応する要素を追加する必要があります。
本記事のまとめ
この記事ではJavaScriptで発生する『Cannot set properties of undefined』や『Cannot set properties of null』エラーについて、以下の内容を説明しました。
Cannot set properties of undefined/null
エラーとはCannot set properties of undefined/null
エラーの原因と解決方法- 未定義(
undefined
)のオブジェクトにプロパティを設定する null
値のオブジェクトにプロパティを設定する- 未定義(
undefined
)の配列の要素に値を設定する null
値の配列の要素に値を設定する- 存在しないDOM要素にプロパティを設定する
- 未定義(
お読み頂きありがとうございました。