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

如果你有对象 x 和 y,你可以将 y 传递给 x 的构造函数,如果 x 的构造函数知道如何转换它,它就会。例如

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

如果你通过 (1, '45'),它会将 '45' 传递给 Number(),你会得到 45。如果你通过 ('', 1),你会得到 '1'。但它可能会给您一些令人惊讶的结果——例如,构造函数 Boolean() 会将除 0 或 false 之外的任何值转换为 true。任何字符串都将转换为“真”——甚至是“假”!

您可能应该准确计算出您需要哪些转换并明确编写它们。我想这是所有可能类型的一个非常有限的子集。(或者重新审视你为什么要这样做,但我讨厌成为那个人!)

于 2013-10-19T21:24:04.760 回答
2

There are only three basic primitives you need to worry about typecasting in JS. Booleans, strings, and numbers (because I'm assuming you're doing this to check for equality === purposes? Maybe concatenation versus mathematical operations?)

Therefore there's three simple methods to do it:

Convert to a boolean - !!

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

Convert to a string - concatenate an empty string

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

Convert to a number - put a + in front of it.

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

Pretty straightforward.

于 2013-10-19T21:51:11.817 回答