我经历了多种方法来检查变量是否为函数,但是我无法弄清优缺点,使用哪个以及为什么。
在typeof
的情况下,我的比较是否会失败?
1)function isFunction(functionToCheck) {
return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]'; }
2)typeof functionToCheck === 'function'
3)functionToCheck.constructor === Function
答案 0 :(得分:3)
在一个完美的世界中,所有这些都应该返回相同的值。
const functionToCheck = () => {};
console.log(isFunction(functionToCheck));
console.log(typeof functionToCheck === 'function');
console.log(functionToCheck.constructor === Function);
console.log(functionToCheck instanceof Function);
function isFunction(functionToCheck){
return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}
在现实世界中,它们之间的差异可能很大。
const functionToCheck = () => {};
// Altering `.toString()` function by some third-party code
Object.prototype.toString = function(){
return '[ABCDEFG]';
}
// Mistake of programmer
functionToCheck.constructor = HTMLElement;
// Having a global scope variable named `Function` by some third-party code
window.Function = class ABC {};
console.log(isFunction(functionToCheck));
console.log(typeof functionToCheck === 'function');
console.log(functionToCheck.constructor === Function);
console.log(functionToCheck instanceof Function);
function isFunction(functionToCheck){
return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}
如您所见,我可以自由更改函数和构造函数,从而依次更改您期望的结果。
最安全的方法是始终使用typeof
来检查功能,因为其结果无法以任何方式更改。