为什么使用typeof来识别函数?

sam*_*ull 8 javascript

是否有任何重要的使用理由

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)

这很简单,可能会有一些改进,但你明白了.


Gum*_*mbo 5

根据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实现应该如何表现的.所以所有方程式都被认为是真的.