将字符串转换为基元

时间:2015-10-24 16:57:56

标签: javascript

我想尽可能地将字符串强制转换为基元,以一种可以安全传递任何值的方式。我正在寻找一个更多"本地人"这样做的方式,而不是试图涵盖所有可能的情况。

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;
}

2 个答案:

答案 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,而你似乎完成了大部分工作。只要确保你拥有的任何实用功能都有足够的测试套件,如果你发现你没有覆盖的情况(或者在规范中添加了新的原语,真的不太可能) ,相应地更新功能及其测试。