在没有length属性的变量上使用.length会导致崩溃

时间:2012-11-24 18:45:27

标签: javascript crash variable-length

我有一个大数组,其中包含所有类型(布尔值,数组,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");
  • 除了nullundefined之外还有哪些其他变种会崩溃?
  • 如何防止这种情况发生?

5 个答案:

答案 0 :(得分:2)

您将获得TypeError声明undefined没有属性。你无法在这里做任何事情,而是将其包裹在TypeError s的试用中。

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

答案 1 :(得分: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");

答案 2 :(得分: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)

答案 3 :(得分: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");

答案 4 :(得分:-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);
}