2017-09-15 8 views
1

Node APIの実装でsnippet_1が気付きました。 Snippet_2は私によって書かれました。私はそれらの間に大きな違いは感じません。実際にはvalueOf()機能を使用する意味はありますか? そしてまた、我々はあなたがオブジェクトラッパーを持っている場合は[Function: valueOf]javascriptのvalueOf()の意味

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

elseケースではどうなりますか?いくつかのコンテキストでこれを見つけた実装をリンクしてください。 – Bergi

+0

本当に 'const valueOf = typeof value.valueOf ==" function "だったはずですか? value.valueOf():null'、それ以外の場合、カスタム 'valueOf'データプロパティを持つオブジェクトでは失敗します。 – Bergi

+0

"*私はそれらの間に大きな違いは感じません。*" - 違いは明白ではありませんか? 2つのスニペットは非常に異なるものです。あなたは本当にそれらがすべての可能な価値について同じ結果を持っていると思いますか? – Bergi

答えて

1

を返しますvalueOfと呼ばれる性質に気づくことができ、あなたがしたいです基礎となるプリミティブ値を取得するには、valueOf()メソッドを使用する必要があります。これはUnboxingと呼ばれます。

すべての通常のオブジェクトには、プロトタイプチェーンの先頭(スコープルックアップのグローバルスコープのような)に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."); 
} 

これはあなたのsnipperと同じように振る舞うだろうか?答えはいいえだ。

関連する問題