在我的特殊情况下:

callback instanceof Function

or

typeof callback == "function"

这有关系吗,有什么区别?

额外的资源:

花园typeof vs instanceof


当前回答

显著的实际差异:

var str = 'hello word';

str instanceof String   // false

typeof str === 'string' // true

别问我为什么。

其他回答

显著的实际差异:

var str = 'hello word';

str instanceof String   // false

typeof str === 'string' // true

别问我为什么。

使用typeof的一个很好的理由是变量可能是未定义的。

alert(typeof undefinedVariable); // alerts the string "undefined"
alert(undefinedVariable instanceof Object); // throws an exception

使用instanceof的一个很好的理由是变量可能为空。

var myNullVar = null;
alert(typeof myNullVar ); // alerts the string "object"
alert(myNullVar  instanceof Object); // alerts "false"

所以在我看来,这取决于你在检查什么类型的数据。

准确地说 应该在通过构造函数(通常是自定义类型)创建值的地方使用Instanceof。

var d = new String("abc")

而typeof用于检查仅由赋值创建的值,例如

var d = "abc"

为了把事情弄清楚,你需要知道两个事实:

instanceof操作符测试构造函数的prototype属性是否出现在对象的prototype链中的任何位置。在大多数情况下,这意味着对象是通过使用该构造函数或其后代构造函数创建的。但prototype也可以通过Object.setPrototypeOf()方法(ECMAScript 2015)或__proto__属性显式设置(旧浏览器,已弃用)。但是,由于性能问题,不建议更改对象的原型。

因此,instanceof仅适用于对象。在大多数情况下,你不会使用构造函数来创建字符串或数字。你可以。但你几乎从来没有这样做过。

instanceof也不能检查使用哪个构造函数创建对象,但返回true,即使对象是从被检查的类派生的。在大多数情况下,这是理想的行为,但有时并非如此。所以你要保持这种心态。

另一个问题是不同的作用域具有不同的执行环境。这意味着它们有不同的内置(不同的全局对象,不同的构造函数,等等)。这可能会导致意想不到的结果。

例如,[]instanceof window.frames[0].Array将返回false,因为Array。== window.frames[0]. array和数组继承自前者。 此外,它不能用于未定义的值,因为它没有原型。

The typeof operator tests whether value belong to one of six basic types: "number", "string", "boolean", "object", "function" or "undefined". Where the string "object" belong all objects (except functions, which are objects, but have its own value in typeof operator), and also "null" value and arrays (for "null" it's a bug, but this bug is so old, so it's become a standard). It doesn't rely on constructors and can be used even if value is undefined. But it's doesn't give any details about objects. So if you needed it, go to instanceof.

现在我们来讨论一个棘手的问题。如果使用构造函数创建基元类型呢?

let num = new Number(5);
console.log(num instanceof Number); // print true
console.log(typeof num); // print object
num++; //num is object right now but still can be handled as number
//and after that:
console.log(num instanceof Number); // print false
console.log(typeof num); // print number

就像魔法一样。但事实并非如此。这就是所谓的装箱(按对象包装原语值)和解装箱(从对象中提取包装的原语值)。这样的代码似乎“有点”脆弱。当然,您可以避免使用构造函数创建原始类型。但还有另一种可能的情况,拳击可能会打到你。在原语类型上使用Function.call()或Function.apply()时。

function test(){
  console.log(typeof this);
} 
test.apply(5);

为了避免这种情况,你可以使用严格模式:

function test(){
  'use strict';
  console.log(typeof this);
} 
test.apply(5);

乌利希期刊指南: 自ECMAScript 2015以来,又增加了一种名为Symbol的类型,它有自己的typeof == " Symbol "。

console.log(typeof Symbol());
// expected output: "symbol"

你可以在MDN上阅读它:(Symbol, typeof)。

typeof:根据MDN文档,typeof是一个一元操作符,返回指示未求值操作数类型的字符串。

在字符串原语和字符串对象的情况下,typeof返回如下:

const a = "I'm a string primitive";
const b = new String("I'm a String Object");

typeof a; --> returns 'string'
typeof b; --> returns 'object'

Instanceof:是一个二进制操作符,接受一个对象和一个构造函数。它返回一个布尔值,指示对象的原型链中是否有给定的构造函数。

当应用于上面的string实例时,并与string进行比较,它的行为如下:

const a = "I'm a string primitive";
const b = new String("I'm a String Object");

a instanceof String; --> returns false
b instanceof String; --> returns true

参考:https://bambielli.com/til/2017-06-18-typeof-vs-instanceof/