2014-02-18 14 views
16

我不明白什麼是Buffer.isBuffer功能的目的時instanceof的作品就像一個魅力:當你使用'instanceof'時,'Buffer.isBuffer'有什麼用?

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

'instanceof'常常被忽視。閱讀[this](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)。提交併沒有解釋爲什麼,但它可能只是一個重構問題,並且有一個確定什麼是「*緩衝區*」的通用定義。這樣可以更容易維護,並且可能在需要時進行更改。雖然,是的,它現在只是'實例緩衝區'。 –

+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層增加了障礙 貢獻,並打破了出口節點的JS文件 用戶態模塊的程序。 (例如,幾個browserify轉換,我的 可讀流填充,util-debuglog模塊等)。這些都是不小的問題。

我建議檢查提交的pull request的整個討論。

相關問題