使用for ... in和instanceof解析对象

时间:2014-10-21 19:08:50

标签: javascript object

我试图在一个对象上循环,并根据它的类型在每个不同的子对象上使用不同的函数。 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。

1 个答案:

答案 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);
    }
}

这将确保仅检查在对象中直接定义的属性。