String conversion to undefined/null/number/boolean

Do you know any better and faster way to convert a string to the type it represents?

I've always been using this function:

var convertType = function (value){
    if (value === "undefined") return undefined;
    if (value === "null") return null;
    if (value === "true") return true;
    if (value === "false") return false;
    var v = Number (value);
    return isNaN (v) ? value : v;
};

Candidates:

//Me, Gabriel Llamas
var cast1 = function (value){
    if (value === "undefined") return undefined;
    if (value === "null") return null;
    if (value === "true") return true;
    if (value === "false") return false;
    var v = Number (value);
    return isNaN (v) ? value : v;
};

//KooiInc
var cast2 = function (value){
    var v = Number (value);
    return !isNaN(v) ? v : 
             value === "undefined" ? undefined
         : value === "null" ? null
         : value === "true" ? true
         : value === "false" ? false
         : value
};

//LightStyle
var cast3 = function (value){
    try {
        return (new Function("return " + value + ";"))();
    } catch(e) {
        return value;
    }
};

//Emmissary's proposal
var cast4 = function (value){
    if (value === "undefined") return undefined;
    try{
        return JSON.parse (value);
    }catch (e){
        return value;
    }
};

Benchmark code (using speedy):

var fn = function (cast){
    cast ("undefined");
    cast ("null");
    cast ("true");
    cast ("false");
    cast ("12");
    cast ("12.34");
    cast ("asd");
};

speedy.run ({
    "cast 1": function (){
        fn (cast1);
    },
    "cast 2": function (){
        fn (cast2);
    },
    "cast 3": function (){
        fn (cast3);
    },
    "cast 4": function (){
        fn (cast4);
    }
});

Result:

File: string-conversion.js

Node v0.10.18
V8 v3.14.5.9
Speedy v0.0.8

Benchmarks: 4
Timeout: 1000ms (1s 0ms)
Samples: 3
Total time per benchmark: ~3000ms (3s 0ms)
Total time: ~12000ms (12s 0ms)

Higher is better (ops/sec)

cast 1
  6,270,458 ± 0.2%
cast 2
  3,305,103 ± 0.0%
cast 3
  54,952 ± 0.0%
cast 4
  82,790 ± 0.4%

Elapsed time: 12109ms (12s 109ms)

This is a simple function which involves the use of a function to evaluate the strings. This way you can remove the part of cases' "switch". Be aware that this handles also assignments to global variables, so I recommend it only if you know anytime where is the source from(don't allow users to use this function!)

var convertType = function (value){
    try {
        return (new Function("return " + value + ";"))();
    } catch(e) {
        return value;
    }
};

You can see the jsfiddle here.


How about:

var convertType = function (value){
  var values = {undefined: undefined, null: null, true: true, false: false}
     ,isNumber = !isNaN(+(value));
  return isNumber && +(value) || !(value in values) && value || values[value];
};
convertType('null');      //=> null
convertType('something'); //=> "something"
convertType('57.321');    //=> 57.321
convertType('undefined'); //=> undefined

This seems faster @ jsPerf

var convertType = function (value){
    var v = Number (value);
    return !isNaN(v) ? v : 
         value === "undefined" ? undefined
       : value === "null" ? null
       : value === "true" ? true
       : value === "false" ? false
       : value
 }

var string2literal = function (value){
  var maps = {
   "NaN": NaN,
   "null": null,
   "undefined": undefined,
   "Infinity": Infinity,
   "-Infinity": -Infinity
   }
  return ((value in maps) ? maps[value] : value);
};

动态数据类型转换中有许多奇怪的规则,只需将其映射即可。

链接地址: http://www.djcxy.com/p/74294.html

上一篇: 问题与十六进制

下一篇: 将字符串转换为undefined / null / number / boolean