为什么以下内容会返回undefined
?
var global_vars =
{
countNumOfProperties :
function (obj)
{
var count = 0;
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
++count;
}
return count;
}
}
};
var DS =
{
file_types_lookup : {}
};
global_vars.countNumOfProperties(DS.file_types_lookup)
答案 0 :(得分:2)
因为对象没有自己的属性,所以for
循环没有执行的迭代,也没有执行return
语句。
我猜你错放了}
:
var count = 0;
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
++count;
}
}
return count;
答案 1 :(得分:1)
return
语句位于循环内部,因此永远不会到达。
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
++count;
}
return count;
}
应该是
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
++count;
}
}
return count;
这样,在返回总和之前将检查每个属性。
如上所述,该函数将返回
1
表示第一个可枚举属性是自己的属性,或0
表示没有自己的属性,但有可枚举的继承属性,或undefined
表示没有可枚举的属性own
或其他。答案 2 :(得分:1)
return count;
语句应该在for
循环之外。
答案 3 :(得分:1)
观察传递 具有属性的对象时会发生什么:
> global_vars.countNumOfProperties({foo: 1})
1
> global_vars.countNumOfProperties({foo: 1, bar: 2})
1
> global_vars.countNumOfProperties({foo: 1, bar: 2, baz: 3})
1
问题是你将return
语句放在循环中。它将在循环体首次执行时执行,返回1
并结束循环。但是,如果循环体永远不会运行(因为没有属性),它永远不会运行,并且函数返回默认值undefined
。
你只需要在循环之外将return
向下移动一行。