2014-02-18 9 views
16

Ich verstehe nicht, was der Zweck der Buffer.isBuffer Funktion ist, wenn instanceof funktioniert wie ein Zauber:Was nutzt 'Buffer.isBuffer', wenn Sie 'instanceof' verwenden können?

var b = new Buffer('blabla') 
assert.ok(b instanceof Buffer) 
+2

'instanceof' ist oft verpönt. Lesen Sie [dies] (http://perfectionkills.com/instanceof-sidered-harmful- or-how-to-write-a-robust-isarray/). Ich bin mir nicht sicher, ob es im Fall von Knoten nicht übermäßig schützend ist. –

+1

'Buffer.isBuffer()' scheint [von Ryan Dahl] eingeführt worden zu sein (https://github.com/joyent/node/commit/02729d4af7b17ea4c7272a0d0d99f6f7418e3237). Das Commit erklärt nicht, warum, aber es ist wahrscheinlich nur eine Frage des Refactorings und einer gemeinsamen Definition, um zu bestimmen, was ein "* buffer *" ist. Dies macht es einfacher zu warten und möglicherweise zu ändern, wenn es jemals benötigt wird. Obwohl, ja, es ist derzeit nur "Instanz Buffer". –

+1

'isBuffer' ist im Moment veraltet. – hellboy

Antwort

23

Nun, eigentlich diese gleich (derzeit zumindest) ist:

-- lib/buffer.js:

Buffer.isBuffer = function isBuffer(b) { 
    return util.isBuffer(b); 
}; 

-- lib/util.js:

function isBuffer(arg) { 
    return arg instanceof Buffer; 
} 
exports.isBuffer = isBuffer; 

... so ist der einzige mögliche Grund Lesbarkeit. Beachten Sie, dass vor dieser spezifischen Implementierung ein set of macros für Typprüfungen beim Erstellen der Quelle verwendet wurde. Aber es wurde mit this commit geändert, und das war die Begründung:

Makros Knoten JS Schicht erhöht die Barriere zu Beiträge hinzufügen, und es bricht Programme, die Knoten js Dateien für Userland-Module exportieren. (Zum Beispiel mehrere Transformationen browserify, meine lesbaren Streams Polyfill, das util-Debuglog-Modul, etc.) Das sind nicht kleine Probleme.

Ich würde vorschlagen, die gesamte Diskussion im Commit pull request zu überprüfen.