2014-02-18 2 views
16

Я не понимаю, что цель функции Buffer.isBuffer когда instanceof работает как шарм:Что использовать 'Buffer.isBuffer', когда вы можете использовать 'instanceof'?

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

'instanceof' часто нахмурился. Прочитайте [это] (http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/). Я не уверен, что он не является чрезмерно защитным в случае узла. –

+1

'Buffer.isBuffer()', как представляется, [введен Ryan Dahl] (https://github.com/joyent/node/commit/02729d4af7b17ea4c7272a0d0d99f6f7418e3237). Конец не объясняет, почему, но это, вероятно, просто вопрос рефакторинга и одно общее определение для определения того, что такое «буфер» *. Это облегчает поддержание и, возможно, изменение в случае необходимости. Хотя, да, в настоящее время это просто «экземпляр Buffer». –

+1

'isBuffer' устарел на данный момент. – hellboy

ответ

23

Ну, на самом деле это те же (в настоящее время, по крайней мере):

-- 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; 

... поэтому единственная возможная причина - читаемость. Обратите внимание, что перед этой конкретной реализацией для проверок типов, используемых при построении источника, существовал set of macros. Но она была изменена с this commit, и это было рассуждение:

Добавления макросов в JS слой узла увеличивает барьер взносов, и он ломает программы, экспортировать файлы узла для расслоения плотного пользовательских модулей. (Например, несколько браунирующих преобразований, my readable-streams polyfill, модуль util-debuglog и т. Д.). Это не маленькие проблемы.

Я предлагаю проверить всю дискуссию в сообщении pull request.

Смежные вопросы