我有一个包含所有类型(布尔值,数组,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");
- 除了
null
和undefined
之外,还有什么变量会崩溃? - 如何防止这种情况发生?
得到一个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);
}