2017-09-15 63 views
1

我注意到其中一個Node API的實現中的snippet_1。 Snippet_2已由我撰寫。我覺得他們之間沒有太大的區別。使用valueOf()函數真的有什麼意義嗎? 而且,我們可以看到一個稱爲valueOf屬性,它會返回[Function: valueOf]valueOf()在javascript中的意義

Snippet_1

Buffer.from = function from(value, encodingOrOffset, length) { 
    const valueOf = value.valueOf && value.valueOf(); 
     if (valueOf !== null && valueOf !== undefined && valueOf !== value) 
     return Buffer.from(valueOf, encodingOrOffset, length); 

} 

Snippet_2

Buffer.from = function from(value, encodingOrOffset, length) { 
    if (value !== null && value !== undefined) 
    return Buffer.from(value, encodingOrOffset, length); 

} 
+0

在其他情況下會發生什麼?您能否將您在某些情況下找到的實現鏈接起來? – Bergi

+0

它真的應該是'const valueOf = typeof value.valueOf ==「function」? value.valueOf():null',否則失敗於具有自定義'valueOf'數據屬性的對象。 – Bergi

+0

「*我覺得他們之間沒有太大的區別。」「 - 差別不明顯嗎?這兩個片段做了非常不同的事情。你真的認爲他們對所有可能的價值有相同的結果嗎? – Bergi

回答

1

如果你有一個對象的包裝,你想獲取基礎原始值,您應該使用valueOf()方法。這被稱爲拆箱

所有的普通對象都有內置的Object.prototype作爲原型鏈的頂部(就像範圍查找中的全局範圍一樣),如果在鏈中的任何位置沒有找到屬性,則屬性解析將停止。 toString()valueOf(),以及此Object.prototype對象上存在的其他幾個常用工具,說明該語言中的所有對象如何訪問它們。

假設下面的例子:

var i = 2; 

Number.prototype.valueOf = function() { 
    return i++; 
}; 

var a = new Number(42); 

if (a == 2 && a == 3) { 
    console.log("Yep, this happened."); 
} 

請問這個行爲與你剪斷的一樣嗎?答案是不。