我试图在一个对象上循环,并根据它的类型在每个不同的子对象上使用不同的函数。 instanceof 似乎是识别非内置类型的唯一方法,因此我尝试将其用于 for ... in ;但是,我没有得到预期的输出。
以下是说明我的问题的示例:http://jsfiddle.net/zv230dvL/2/
function testObject(){}
function testContainer(objects){
this.zero = objects[0];
this.one = objects[1];
this.two = objects[2];
}
var singleObject = new testObject();
var container = new testContainer(
[new testObject(),
new testObject(),
new testObject()]
);
...
//Testing if a single object functions as expected
out(singleObject instanceof testObject);
//Testing if directly referencing an object
//in a container functions as expected
out(container.zero instanceof testObject);
//iterating through a container object...
for(i in container){
out(i instanceof testObject);
}
输出
true
true
false
false
false
首先,做这样的事情的适当方法是什么?
其次,为什么 for ... in 循环中的变量以这种方式运行?
请不要jQuery。
答案 0 :(得分:3)
当您使用for..in
迭代对象时,循环变量将具有键字符串类型。所以,你应该像这样检查
for (i in container) {
out(container[i] instanceof testObject);
}
现在,您正在使用与i
中的密钥container
对应的对象。通过此更改,所有项目都将评估为true
。
注意: for..in
也应该提供所有继承的属性。因此,将for..in
与Object一起使用时的正常循环模式是
for (i in container) {
if (container.hasOwnProperty(i)) {
out(container[i] instanceof testObject);
}
}
这将确保仅检查在对象中直接定义的属性。