请参阅jsfiddle中的代码 - http://jsfiddle.net/gr7pa2yz/
var obj = {
x: 4,
y: 2,
z: {
z1: {
z11: "who",
z12: 44
}
},
zx: [3, 4, "string"],
zy: undefined
}
iterate(obj);
function iterate(obj) {
$.each(obj, function (i, e) {
if (typeof e == "object") iterate(e);
alert(e);
});
}
我的问题 - 您会看到上面的代码警告了3件无法理解的事情。它提醒 - [对象对象]两次和3,4,字符串。怎么来的?
答案 0 :(得分:3)
这两个对象是
{ z11: "who", z12: 44 }
{ z1: { z11: "who", z12: 44 } }
您看到"[object Object]"
因为alert
调用了对象的toString
方法:
Object.prototype.toString(); // "[object Object]"
由于数组"3,4,string"
,您也会获得[3, 4, "string"]
。
数组也是对象,Object.prototype.toString
被Array.prototype.toString
覆盖,调用join
:
[3, 4, "string"].join(); // "3,4,string"
答案 1 :(得分:2)
您正在迭代对象并为对象的每个属性调用alert
。因此,您还要提醒对象z
和z1
本身(而不是其内容),这会导致[Object object]
。
你想要这样的东西吗?
$.each(obj, function(i, e) {
if (typeof e == 'object') {
iterate(e);
} else {
alert(e);
}
}
答案 2 :(得分:0)
它向您显示[object Object]
因为,当面对某个对象时,您的代码首先执行此操作:
if (typeof e == "object") iterate(e);
......但是在完成之后,它就是这样做的:
alert(e);
后一位是为您提供[object Object]
警报。
如果您的目标是致电iterate
而不是致电alert
:
if (typeof e == "object") iterate(e);
else alert(e);
或者,这个更容易调试的版本:
if (typeof e == "object") {
iterate(e);
}
else {
alert(e);
}
旁注:typeof null
为"object"
;现在,null
将炸毁你的迭代函数。