0

私はすべての種類の型(ブール値、配列、null、...)を含む大きな配列を持っており、それらの適切性にアクセスしようとしていますがarr[i].length、それらのいくつかは明らかに長さを持っていません。

長さが足りない人が戻ってきてもかまいませんがundefined(私は単に使用するarr[i].length||0か、そのようなものを使用できます)、そうではありません。全体がいくつかの値でクラッシュします(nullまたはundefinedたとえば)。

var i, len, arr;

arr = [true, ["elm_0"], 99, "abc"]; //crashes if you add 'null' or 'undefined'

for(i = 0, len = arr.length ; i<len ; i++){
    document.write(arr[i].length + "<br>");
}

document.write("I was executed");
  • 他にどのような変数がクラッシュnullundefinedますか?
  • これを防ぐ方法は?
4

5 に答える 5

2

タイプ固有のチェックを行わずにnullをチェックするだけで、未定義の値もキャッチされます。

var i, len, arr;
arr = [true, ["elm_0"], 99, "abc", null, undefined];
for (i = 0, len = arr.length; i < len; i++) {
    if (arr[i] != null) {
        console.log(arr[i].length);
    }
}
console.log("I was executed");
于 2012-11-24T18:52:41.213 に答える
2

プロパティがないTypeErrorという記述を取得します。undefinedここでできることは何もありませんが、sのtrycatchでラップしますTypeError

これは、undefinedと評価されるもののプロパティを参照すると:が返されるのと同じ理由であることに注意してくださいReferenceErrorundefinedプロパティを持つべきではありません。

于 2012-11-24T18:50:42.897 に答える
1

arr[i]前に確認してくださいarr[i].length

var i, len, arr;

arr = [true, ["elm_0"], 99, "abc"];

if(arr) for(i = 0, len = arr.length || 0 ; i<len ; i++){
    if(arr[i]) document.write((arr[i].length || 0) + "<br>");
    else document.write(0 + "<br>"); // what to do if no arr[i]
}

document.write("I was executed");

三項演算子も使用できます(arr[i]?arr[i].length||0:0)

于 2012-11-24T18:54:07.217 に答える
0

これを試して:

var i, len, arr;

arr = [true, ["elm_0"], 99, "abc"]; //crashes if you add 'null' or 'undefined'

for(i = 0, len = arr.length ; i<len ; i++){

try{
console.log(arr[i].length);
}Catch(e){console.log(0);}
}

console.log("I was executed");
于 2012-11-24T18:49:29.363 に答える
-1

これらのオブジェクトの1つが配列であるかどうかを判断することが唯一の目標である場合は、次の代わりに次のようにします。

for(i = 0, len = arr.length ; i<len ; i++){
    console.log(arr[i].length);
}

これを試してみてください:

for(i = 0, len = arr.length ; i<len ; i++){
    if (arr[i] instanceof Array)
        console.log(arr[i].length);
}
于 2012-11-24T18:49:06.897 に答える