在没有 length 属性的变量上使用 .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之外,还有什么变量会崩溃?
  • 如何防止这种情况发生?
你会

得到一个TypeError,说明undefined没有属性。你在这里无能为力,只能把它包裹在尝试捕获TypeError秒。

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

您可以只检查 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");

arr[i].length之前检查arr[i]

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)

试试这个:

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");

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

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);
}

相关内容

  • 没有找到相关文章

最新更新