0

最初にここに登場した次の追加機能があります。 addは引数を 1 つしか取りませんが、カリー化とクロージャーの「魔法」により、「無限」回そうすることができます。

function add (a) {
    var f = b => add(a + b);

    f.valueOf = () => a;

    return f;
}

var add4 = add(2)(2);
var add6 = add4(2);
var add10 = add6(2)(2);
var add14 = add10(2)+2;
//var add16 = add14(2); no longer works because of type conversion above.
console.log(+add4, +add6, +add10, add14);
//logs 4, 6, 10, 14

上記で、関数がa追加の引数を取り続けることができる新しい値を持つ関数を作成し続けることができることがわかります。この関数は、 などの数学演算の目的で通常の変数としても機能しますvar sum = add(x)+y;

ただし、型変換が行われるとsum、前の例の は関数ではなくなり、数値に変換されます。

背景が邪魔にならなくなったので、私の質問は次のとおりaddです。算術演算で使用できるようにしながら、関数の型強制を防ぐ(比較的簡単な)方法はありますか?または、言い換えれば、ボイラープレートをあまり追加せずに (できれば構造を維持しながら) valueOf(および/または値) を直接変更する簡単な方法はありますか?aadd(x)+y;

4

1 に答える 1

1

あなたが避けようとしている数値への強制は、add() 関数とは関係がないと思います。これは、Javascript の「+」演算子が機能する方法です。したがって、この動作を変更するのは「簡単な」作業ではありません。JavaScript パーサーの動作方法を変更する必要があるかもしれません。

私が考えることができる最も簡単な回避策 (もちろん、この関数をどのように正確に使用しているかはわかりません) は、常に追加の add() 呼び出しで結果をラップすることです。

add(2)(3) + 8; // 13, number

次のようにラップできます。

add( add(2)(3) + 8 ); // function with valueOf = 13

繰り返しますが、正確なユースケースについてはわかりません。

于 2016-06-03T08:04:52.017 に答える