是否有任何重要的使用理由
typeof variable === 'function'
Run Code Online (Sandbox Code Playgroud)
与
!!variable.call
Run Code Online (Sandbox Code Playgroud)
用于检测变量是否是函数?
除了显而易见的人之外可能会创建一个对象:
{ call: 1 }
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是
typeof /regex/ === 'function'
Run Code Online (Sandbox Code Playgroud)
返回true,但是
!!/regex/.call
Run Code Online (Sandbox Code Playgroud)
返回false
use*_*716 10
最安全的方法是通过在调用时将对象设置为方法的thisArg参数来检查内部[[Class]]属性..call()Object.prototype.toString
Object.prototype.toString.call( myVariable ) === '[object Function]';
Run Code Online (Sandbox Code Playgroud)
当然,您可以轻松地创建一个函数:
function checkClass( obj ) {
return Object.prototype.toString.call( obj ).slice( 8, -1).toLowerCase();
}
checkClass( myVariable ) === 'function';
Run Code Online (Sandbox Code Playgroud)
这很简单,可能会有一些改进,但你明白了.
根据ECMAScript规范,以下内容应适用于正则表达式文字:
正则表达式文字是一个输入元素,在扫描时会转换为RegExp对象(第15.10节).在评估包含程序或函数开始之前创建对象.
所以typeof /regex/应该屈服"object":
typeof /regex/ === "object"
Run Code Online (Sandbox Code Playgroud)
并且正则表达式文字创建的对象的构造函数应该是RegExp:
/regex/.constructor === RegExp
Run Code Online (Sandbox Code Playgroud)
与此类似,函数定义应该产生一个Function对象:
(function(){}).constructor === Function
Run Code Online (Sandbox Code Playgroud)
但是虽然这会返回一个Function对象,但是typeof运算符不应该屈服"object","function"而是:
typeof function(){} === "function"
Run Code Online (Sandbox Code Playgroud)
这是因为对象是否实现了Function对象特有的内部[[Call]]属性.
请注意,这一切都是Javascript实现应该如何表现的.所以所有方程式都被认为是真的.