我有一个大数组,其中包含所有类型(布尔值,数组,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
之外还有哪些其他变种会崩溃?答案 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);
}