如何判断一个 JavaScript 变量是否为函数

36

我需要循环遍历 JavaScript 对象的属性。如何判断一个属性是函数还是值?

var model =
{
    propertyA: 123,
    propertyB: function () { return 456; }
};

for (var property in model)
{
    var value;
    if(model[property] is function) //how can I tell if it is a function???
        value = model[property]();
    else 
        value = model[property];
}

1
可能是重复的问题:如何检查JavaScript变量是否为函数类型? - sierrasdetandil
3个回答

58

使用typeof运算符

if (typeof model[property] == 'function') ...

同时,注意要确保您正在迭代的属性是属于此对象的,而不是作为公共属性继承自其他对象原型链上的某个对象:

for (var property in model){
  if (!model.hasOwnProperty(property)) continue;
  ...
}

只有当属性是本地函数时,它才是可靠的。如果它是一个宿主对象,你可以得到任何东西,甚至是一个错误。 - RobG
@RobG 哦?在Safari、Chrome、Firefox和Opera上,typeof (new XMLHttpRequest).getAllResponseHeaders返回"function"。这是IE的问题吗,还是你想到了不同的宿主对象或方法?(我并不怀疑你,我只是在寻找一个例子。) - Phrogz

6

我认为以下内容对您可能会有所帮助。

如何检查JavaScript变量是否为函数类型?

顺便说一句,我使用以下方法来检查函数。

    // Test data
    var f1 = function () { alert("test"); }
    var o1 = { Name: "Object_1" };
    F_est = function () { };
    var o2 = new F_est();

    // Results
    alert(f1 instanceof Function); // true
    alert(o1 instanceof Function); // false
    alert(o2 instanceof Function); // false

2
请注意,虽然可能性很小,但如果您正在测试来自另一个窗口框架的函数值(因为每个框架都有自己的“Function”根),则此操作将失败。 - Phrogz

0
你可以使用以下解决方案检查JavaScript变量是否为函数:
var model =
{
    propertyA: 123,
    propertyB: function () { return 456; }
};

for (var property in model)
{
    var value;
    if(typeof model[property] == 'function') // Like so!
    else 
        value = model[property];
}

4
除了注释之外,考虑提供一点书面说明来解释你所做的事情。可以在代码前面加上建议,使用 "typeof 运算符来确定属性值的类型。" - Wyck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接