543 Stimmen

Was ist der Unterschied zwischen typeof und instanceof und wann sollte das eine im Gegensatz zum anderen verwendet werden?

In meinem speziellen Fall:

callback instanceof Function

または

typeof callback == "function"

Spielt das überhaupt eine Rolle, was ist der Unterschied?

Zusätzliche Ressource:

JavaScript-Garten typeof gegen instanceof

-1voto

Keplerf1 Punkte 84

Da ich aus einer strengen OO-Erziehung komme, würde ich mich für

callback instanceof Function

Strings sind anfällig für meine schreckliche Rechtschreibung oder andere Tippfehler. Außerdem finde ich, dass es sich besser liest.

-1voto

Suprido Punkte 495

Trotz instanceof vielleicht ein bisschen schneller sein als typeof Ich ziehe die zweite vor, weil sie so magisch sein kann:

function Class() {};
Class.prototype = Function;

var funcWannaBe = new Class;

console.log(funcWannaBe instanceof Function); //true
console.log(typeof funcWannaBe === "function"); //false
funcWannaBe(); //Uncaught TypeError: funcWannaBe is not a function

-1voto

Ein weiterer Fall ist, dass Sie nur mit instanceof - gibt er true oder false zurück. Mit typeof können Sie die Art der bereitgestellten etwas

-1voto

Khalid Rafik Punkte 37

Mit Blick auf die Leistung verwenden Sie besser typeof mit einer typischen Hardware, wenn Sie ein Skript mit einer Schleife von 10 Millionen Iterationen erstellen die Anweisung: typeof str == 'string' benötigt 9ms während 'string' instanceof String 19ms benötigt

-1voto

AL-zami Punkte 8287

Natürlich ist es wichtig........ !

In unserem Beispiel werden wir die Funktion auf zwei verschiedene Arten deklarieren.

Wir werden beides verwenden function declaration und _Funktion Konstrukteur_ . Wir werden sehen, wie typeof et instanceof in diesen beiden unterschiedlichen Szenarien verhält.

Funktion mit Funktionsdeklaration erstellen:

function MyFunc(){  }

typeof Myfunc == 'function' // true

MyFunc instanceof Function // false

Eine mögliche Erklärung für dieses unterschiedliche Ergebnis ist, dass wir eine Funktionsdeklaration vorgenommen haben, typeof kann verstehen, dass es sich um eine Funktion handelt, denn typeof prüft, ob der Ausdruck, auf den typeof angewendet wird, in unserem Fall MyFunc implementiert _Methode aufrufen_ oder nicht . Wenn sie implementiert Call Methode ist es eine Funktion, andernfalls nicht, zur Klärung siehe ecmascript-Spezifikation für typeof .

Funktion mit Funktionskonstruktor erstellen:

var MyFunc2 = new Function('a','b','return a+b') // A function constructor is used 

typeof MyFunc2 == 'function' // true

MyFunc2 instanceof Function // true

Hier typeof behauptet, dass MyFunc2 ist eine Funktion, ebenso wie die instanceof Wir wissen bereits typeof prüfen, ob MyFunc2 implementiert Call Methode oder nicht, da MyFunc2 ist eine Funktion und implementiert call Methode, so wird typeof weiß, dass es sich um eine Funktion handelt, andererseits haben wir function constructor zu erstellen MyFunc2 wird sie zu einer Instanz von Function constructor Deshalb instanceof beschließt außerdem, dass true .

Was ist am sichersten zu verwenden?

Wie wir in beiden Fällen sehen können typeof Operator erfolgreich behaupten kann, dass wir es hier mit einer Funktion zu tun haben, ist es sicherer als instanceof . instanceof scheitert im Falle von function declaration denn function declarations sind nicht ein Fall von Function constructor .

Bewährte Verfahren :

Als Gary Rafferty vorgeschlagen hat, sollte man am besten typeof und instanceof zusammen verwenden.

  function isFunction(functionItem) {

        return typeof(functionItem) == 'function' || functionItem instanceof Function;

  }

  isFunction(MyFunc) // invoke it by passing our test function as parameter

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X