关于javascript:如何检查函数中传递的参数是字符串还是元素?

how to check a parameter passed in a function is a string or an element?

本问题已经有最佳答案,请猛点这里访问。

我想知道如何在一个接受单个参数的函数中传递两种不同类型的值。

让函数是function a(b){return c;}

我正在尝试传递一个字符串,同时调用函数a一些地方,如a('a string value')然后我会用它做一些事情。 现在我需要传递一个像a(jquery('#someDiv'))这样的html元素,然后我会另外一些东西。 我需要区分函数声明。

专家的任何想法?

提前致谢。

编辑:

我正在寻找一个提示来检查我要传递的数据类型作为函数a的参数。 它可以是字符串,数字或对象,甚至是函数。 我不想使用后备。 我想通过错误或异常使用最后一个else语句。


typeof运算符可用于测试字符串。

1
2
3
if (typeof b == 'string') {
    //handle string
}

第二部分有点棘手。 typeof将返回object以获取jQuery对象。我相信使用Object.getPrototypeOf检查对象的[[Prototype]]是否与jQuery构造函数的原型相同是足够安全的:

1
2
3
else if (Object.getPrototypeOf(b) === $.fn) {
    //it is an object that inherits from the jQuery prototype
}

但IE <9不支持。如果需要回退,instanceof将具有类似的效果,可以使用而不是Object.getPrototypeOf

1
else if (b instanceof jQuery) {}

因此,旧IE支持的完整解决方案:

1
2
3
4
5
6
7
if (typeof b == 'string') {
    //handle string
} else if (b instanceof jQuery) {
    //handle jQuery object
} else {
    throw 'Invalid argument';
}

*注意instanceof将返回true,即使构造函数"子类化"jQuery(在原型链中有一个链接到jQuery),而Object.getPrototypeOf只返回true,如果对象的内部[[Prototype]]指向与jQuery构造函数的原型相同的对象。如果这会产生影响,这是相当罕见的,但值得记住。

然而,在这些小问题中,这个相关的问题已经instanceof作为公认的答案,因为它是最兼容的解决方案。

为了解释一些事情,jQuery本身不是构造函数,但它的原型对象与jQuery.fn.init共享,它是实际的构造函数,而jQuery.fnjQuery.prototype的简写,所以:

1
2
jQuery.fn.init.prototype === jQuery.prototype
jQuery.prototype === jQuery.fn

这已经有点偏离主题了,所以这里有一篇更深入的文章给感兴趣的读者:jQuery如何将对象实例化为jQuery.fn.init,如果你想继承jQuery,这意味着什么