jQuery - 为什么它会提醒不需要的东西
jQuery - Why does it alert unwanted things?
请参阅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,字符串。怎么来了?
这两个对象是
-
{ 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"
您正在迭代对象并为对象的每个属性调用alert
。因此,您还会提醒对象z
并z1
自身(而不是其内容),从而导致[Object object]
。
你想要这样的东西吗?
$.each(obj, function(i, e) {
if (typeof e == 'object') {
iterate(e);
} else {
alert(e);
}
}
它向你展示了[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
s会破坏你的迭代函数。
相关文章:
- 为什么Java代码需要编译,而JavaScript代码不需要
- jQuery - 为什么它会提醒不需要的东西
- 在angularjs中拥有$sce或严格上下文转义有什么好处,为什么反应不需要这样做
- 为什么在成功函数的末尾不需要有“()”
- 为什么 => { } 中的代码需要返回,而 => 中的内容不需要
- 为什么数学对象在javascript中不需要新关键字
- 为什么variable'name'首次使用[Javascript]后不需要初始化
- 为什么我不需要在Sails.js控制器函数中调用next,即使它在其主体中有一个(异步的?)数据库查询
- 为什么$http.Get不需要返回任何东西
- 为什么JavaScript不需要在函数声明后加分号?
- 为什么canvas id在JavaScript中不需要引用?
- 不需要参数的回调-为什么?
- 为什么immutable.js类不需要"new"
- 在angular 1.4.4中,为什么作用域变量的变化不需要$watch或$apply就能传播到DOM ?
- 为什么不需要一开始就进行淘汰赛验证
- 为什么“type”"不需要括号
- 为什么会有'事件'变量可用,而不需要在上游发生事件时定义
- 不理解为什么需要返回语句
- 为什么我不能'不需要在Node.js shell模块
- 为什么不需要在构造函数中指定变量?