1. ホーム
  2. javascript

[解決済み】TypeError: 'undefined'はオブジェクトではありません。

2022-01-19 16:38:06

質問

現在、かなり機能不全のJavascriptプログラムがあり、問題を起こしています。しかし、どうしても理解できないエラーが1つだけ発生します。

TypeError: 'undefined' is not an object (evaluating 'sub.from.length')

私がやろうとしていることは、皆さんも推測できるように length のある" from の配列になります。 sub ディクショナリーを作成します。以下は 関数全体のソースコード そして、エラーの原因となっていると思われるループのコードは以下の通りです。

console.log(afcHelper_ffuSubmissions.length); // just for debugging, returns the correct number
for (var i = 0; i < afcHelper_ffuSubmissions.length; i++) { // this whole section works fine
    var sub = afcHelper_ffuSubmissions[i];
    //console.log("THIS IS BROKEN DOWN BY LINK",afcHelper_Submissions[i]);
    if (pagetext.indexOf(afcHelper_ffuSections[sub.section]) == -1) {
        // Someone has modified the section in the mean time. Skip.
        document.getElementById('afcHelper_status').innerHTML += '<li>Skipping ' + sub.title + ': Cannot find section. Perhaps it was modified in the mean time?</li>';
        continue;
    }
    var text = afcHelper_ffuSections[sub.section];
    var startindex = pagetext.indexOf(afcHelper_ffuSections[sub.section]);
    var endindex = startindex + text.length;

    console.log(sub); 
    if (typeof(sub.from) != 'undefined' && sub.from.length > 0) { // ** problem spot?? this is the code i recently added.
        for (var i = 0; i < sub.from.length; i++) {
            mainid = sub.from[i]['id'];
            var sub = afcHelper_Submissions[mainid]; // and then it goes on from here...

何かアイデアがあれば、教えてください。正直なところ、私はなぜ私が TypeError を明示的にチェックしたものについては、( typeof(sub.from) )...

解決方法は?

未定義でないことを確認すると同時に、未定義であることをエラーにするのはどうかと思います。どのブラウザをお使いですか?

次のような方法でチェックできます(=を追加して、長さを真偽判定にする)。

if (typeof sub !== 'undefined' && sub.from && sub.from.length) {

[更新]をクリックします。

subをリセットし、それによってsub.fromもリセットしていますが、sub.fromが存在するかどうかを再確認していませんね。

for (var i = 0; i < sub.from.length; i++) {//<== assuming sub.from.exist
            mainid = sub.from[i]['id'];
            var sub = afcHelper_Submissions[mainid]; // <== re setting sub

私の推測では、エラーは if 文ではなく for(i... ステートメントを使用します。Firebugでは、エラー時に自動的にブレークすることができるので、その行でブレークするのだと思います(if文の上ではありません)。