jQuery - 为什么它会提醒不需要的东西?

时间:2015-01-04 19:24:42

标签: javascript jquery

请参阅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,字符串。怎么来的?

3 个答案:

答案 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.toStringArray.prototype.toString覆盖,调用join

[3, 4, "string"].join(); // "3,4,string"

答案 1 :(得分:2)

您正在迭代对象并为对象的每个属性调用alert。因此,您还要提醒对象zz1本身(而不是其内容),这会导致[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将炸毁你的迭代函数。