0

我有一个包含各种类型(布尔值、数组、null、...)的大数组,我正在尝试访问它们的属性arr[i].length,但其中一些显然没有长度。

我不介意那些缺少长度的人是否返回undefined(我可以简单地使用arr[i].length||0或类似的东西),但事实并非如此,整个事情会因某些值(nullundefined例如)而崩溃。

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");
  • null除了and之外,还有哪些其他 var 会崩溃undefined
  • 如何防止这种情况发生?
4

5 回答 5

2

你会得到一个没有属性的TypeError声明。undefined除了将它包装在 s 的 try catch 中,您无能为力TypeError

请注意,这与在评估为 undefined 的事物上引用属性将返回ReferenceError:undefined永远不应该具有属性的原因相同。

于 2012-11-24T18:50:42.897 回答
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 回答
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

如果您的唯一目标是确定这些对象之一是否为数组,则不要:

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 回答