0

rhs を lhs の型に変換する関数を検索します。例えば

var x=false // x is boolean now;
x=assign (x, "true"); //should convert "true" to boolean and return that
x=assign (x, 1); // dto, convert 1 to true
x=0 // x is number
x=assign (x, "123"); // should convert "123" to 123;

そのような関数を書くことができるので、それは問題ではありません。しかし:そのようなことの何とか完全な実装はどこかにありますか?私はそのようなものから始めました:

function assign (v, x) {
  if (typeof v==typeof x) {
    return x;
  }
  switch (typeof v) {
    case 'boolean' : {
      return x=='true'?true:false;
    }
    case 'number' : {
      return parseFloat(x);
    }
  }
  return "xxx";
}
var v=true;
var x='true';
var r1=assign (v, x);
console.log (typeof r1+ " "+r1);
v=10;
x="123";
var r1=assign (v, x);
console.log (typeof r1+ " "+r1);

もちろん、これは完全ではありませんが、おそらく私が何を求めているかを示しています。

4

2 に答える 2

2

JS での型キャストについて考慮する必要がある基本的なプリミティブは 3 つだけです。ブール値、文字列、および数値 (これは、等しいかどうかを確認するためにこれを行っていると想定している===ためですか? 連結と数学演算の関係でしょうか?)

したがって、それを行うには 3 つの簡単な方法があります。

ブール値に変換 -!!

var x = 1;
console.log(!!x); //true;

文字列に変換 - 空の文字列を連結します

var x = 1;
console.log(x+''); //"1"

数値に変換 - の前に a+を付けます。

var x = "-123";
console.log(+x); //-123

かなり簡単です。

于 2013-10-19T21:51:11.817 に答える
2

オブジェクト x と y がある場合、x のコンストラクターに y を渡すことができます。x のコンストラクターがそれを変換する方法を知っていれば、そうします。例えば

function y_in_type_of_x(x, y) 
{ 
  return x.constructor(y); 
}

(1, '45') を渡すと、'45' が Number() に渡され、45 が返されます。('', 1) を渡すと、'1' が返されます。しかし、驚くべき結果が得られる可能性があります。たとえば、コンストラクタ Boolean() は、0 または false 以外のものをすべて true に変換します。どの文字列も「true」に変換されます。文字列「false」も同様です。

おそらく、どの変換が必要かを正確に判断し、明示的に記述する必要があります。考えられるすべてのタイプの非常に限られたサブセットであると思います。(または、なぜこれを行っているのかを再検討してください。しかし、私はその男になるのは嫌いです!)

于 2013-10-19T21:24:04.760 に答える