将字符串转换为原语

Converting Strings to primitives

本文关键字:原语 转换 字符串      更新时间:2023-09-26

我希望尽可能将字符串强制转换为原语,以一种可以安全地传递任何值的方式。我正在寻找一种更"原生"的方式来做这件事,而不是试图涵盖所有可能的情况。

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

您的代码的问题是,isNaN单独不能用于正确检测数字字符串。

例如,自+" " === 0,则isNaN(" ") === false

相反,我建议使用这个测试用例列表中的第二个isNumeric函数,取自验证JavaScript中的十进制数字。

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

我将继续说我认为我们都在评论中说的:没有一种原生方法可以完全做到你所概述的。

你说过要涵盖所有的基本要素,但实际上要涵盖的基本要素并没有那么多,它们都列在规范中,而且你似乎已经完成了大部分工作。只要确保您拥有的任何实用程序函数都具有足够的测试套件,并且如果您发现没有涵盖的情况(或者在规范中添加了新的原语,这是真的不可能的),请相应地更新函数及其测试。