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语句。
-
if(typeof(b)=='string'){....}
-
if (typeof b ==="string") { /* Holy cow, it's a string */ } else { /* Maybe its a jQuery object */ };
-
jquery('#someDiv')返回一个jQuery对象,而不是HTML元素。
-
typeof的文档。 请注意,typeof jQuery('div')将是'object'。
-
这不完全是重复的
-
你通常可以使用简单的鸭子类型:b.split? str:obj;
-
谢谢大家的努力。 我真正想要的是一个区分javascript变量类型的提示。 这里我使用字符串和jquery对象给出了示例。 但我希望我的功能能够接收任何类型的数据。 也许可以有字符串或数字或某些html元素或某些对象甚至某些功能。 我正在寻找一个提示,以明确地确定其中任何一个。 但我不知道为什么以及我最终如何成为一个重复的问题。 也许我没有在我的问题中解释它。
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.fn是jQuery.prototype的简写,所以:
1 2
| jQuery.fn.init.prototype === jQuery.prototype
jQuery.prototype === jQuery.fn |
这已经有点偏离主题了,所以这里有一篇更深入的文章给感兴趣的读者:jQuery如何将对象实例化为jQuery.fn.init,如果你想继承jQuery,这意味着什么
-
谢谢你的解决方案。 它非常接近我正在寻找的提示。 我编辑了我的问题。 我希望你能再一次理解我的问题。 再次感谢。
-
好吧,你必须为typeof b == 'function'和typeof b == 'number'添加几个else if分支。 或者您想要简单地识别对象的类型? 我担心如果没有构造函数/原型来测试对象,后者可能无法实现。
-
非常感谢。 我试过这个,结果是最新的。 非常感谢您的合作。