2017-09-15 60 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."); 
} 

请问这个行为与你剪断的一样吗?答案是不。