我想尽可能地将字符串强制转换为基元,以一种可以安全传递任何值的方式。我正在寻找一个更多"本地人"这样做的方式,而不是试图涵盖所有可能的情况。
value("0") //0
value("1") //1
value("-1") //-1
value("3.14") //3.14
value("0x2") //2
value("1e+99") //1e+99
value("true") //true
value("false") //false
value("null") //null
value("NaN") //NaN
value("undefined") //undefined
value("Infinity") //Infinity
value("-Infinity") //-Infinity
value("") //""
value(" ") //" "
value("foo") //"foo"
value("1 pizza") //"1 pizza"
value([]) //[]
value({}) //{}
value(0) //0
value(1) //1
value(-1) //-1
value(3.14) //3.14
value(0x2) //2
value(1e+99) //1e+99
你明白了
function value(x){
if(typeof x==="string"){
if(x=="") return x;
if(!isNaN(x)) return Number(x);
if(x=="true") return true;
if(x=="false") return false;
if(x=="null") return null;
if(x=="undefined") return undefined;
}
return x;
}
主要问题是因为isNaN()返回"是一个数字"对于像
这样的事情"" empty strings
" " blank strings
[] arrays
etc
根据接受的答案:
function value(x) {
if (typeof x === "string") {
switch (x) {
case "true": return true;
case "false": return false;
case "null": return null;
case "undefined": return void 0;
}
if (!isNaN(x) && !isNaN(parseFloat(x))) return +x;
}
return x;
}
答案 0 :(得分:1)
您的代码存在的问题是,isNaN
无法单独使用+" " === 0
来正确检测数字字符串。
例如,自isNaN(" ") === false
起,然后isNumeric
。
相反,我建议使用this list of testcases的第function isNumeric(n) {
return !isNaN(n) && !isNaN(parseFloat(n));
}
function value(x){
if(typeof x !== "string") return x;
switch(x) {
case "true": return true;
case "false": return false;
case "null": return null;
case "undefined": return void 0;
}
if(isNumeric(x)) return +x;
return x;
}
个{{1}}函数,取自Validate decimal numbers in JavaScript。
{{1}}
答案 1 :(得分:0)
我会继续说出我认为我们在评论中所说的内容:没有本地方法可以完成您所概述的内容。
你已经谈过覆盖所有基础,但实际上并没有那么多基础可以覆盖,它们是listed in the specification,而你似乎完成了大部分工作。只要确保你拥有的任何实用功能都有足够的测试套件,如果你发现你没有覆盖的情况(或者在规范中添加了新的原语,真的不太可能) ,相应地更新功能及其测试。