首页 > 代码库 > JavaScript 数据类型转换

JavaScript 数据类型转换


      JavaScript是一门动态类型语言,变量是没有类型的,可以随时赋予任意值。但数据本身和运算是区别类型的。因此需要进行数据类型转化,有些转换是自动进行的,有些转换则需要强制转化。

1.强制转换 

      强制转化使用三个构造函数:Number、String和Boolean,手动将各种类型的值转化为数字、字符串或者布尔值。  

1.1 Number函数:强制转化为数值 ,

      原始类型值的转换规则

1)数值:转换后还是原来的值

2)布尔值:true转化为1,false转化为0

3)undefined:转化为NaN

4)null:转化为0

5)字符串:转换规则较多,如下所示:

------如果字符串中只包含数字,转化为相应的十进制数值。eg:"1"转化为1,"123"转化为123,而"011"转化为11(忽略前导0);

------如果字符串中包含有效的浮点格式,转化为浮点数。eg:"12.3"转化为12.3(也会忽略前导0);

------如果字符串为空字符"",返回0;

------如果字符串中包含有效的十六进制格式,如"0xf",返回对应的十进制数值(由于忽略前导0,不能识别八进制数值);

------除上述规则外,其它情况下返回NaN。

 eg: console.log(Number("123"));  "123abc"--->NaN、""--->0、"0xf"--->15、undefined--->NaN、null--->0、false--->0;

       console.log(Number("\t\r\v12.34\n ")); //12.34(Number函数会自动过滤一个字符串前导和后缀中的空格) 

     对象的转换规则

1)首先调用对象自身的valueOf方法,如果结果为原始类型的值(数值、字符串或布尔值),再对该值使用Number函数

2)如果valueOf方法返回复合类型的值,则调用对象自身的toString方法,如果结果为原始类型的值,再对该值使用Number函数

3)如果toString方法返回的是复合类型的值,则报错

    eg:Number({a:1}); //NaN

    上面代码的执行过程如下:

if(typeof {a:1}.valueOf() === "object") {
     Number({a:1}.toString());
else {
     Number({a:1}.valueOf());
}

    上面代码分析如下:首先调用对象的valueOf方法,返回对象本身{a:1},所以toString方法的返回值"[Object Object]"使用Number函数,结果为NaN。

    如果toString方法返回的是复合类型的值,则会报错。TypeError: Cannot convert object to primitive value

var obj = {
    toString: function() {
        console.log("toString");
        return {};   
    },
    valueOf: function() {
        console.log("toString");
        return {};
    }
}
Number(obj);

    上述代码中,valueOf方法和toString方法返回的都是对象,因此转换时出错。

Number({valueOf: function() {return 2; }});
Number({toString: function(){ return 3; }});
Number({valueOf: function(){ return 2;}, toString: function() {return 3;}});

    上述代码的执行结果分别是:2,3,3。第一个对象返回valueOf方法的值,第二个对象返回toString方法的值,第三个对象表示valueOf方法先与toString方法执行。

******在chrome console中运行{a:1}.valueOf(); 报错:"SyntaxError: Unexpected token . ",这是由于{}被js引擎解析为代码块,它是没有valueOf方法。

******valueOf()返回对象的原始值,

var o = {a:1}; o.valueOf(); // Object {a: 1}

var o = {a:1}; o.toString();  //"[object Object]"

[1,2,3].valueOf(); //[1.2.3]

"hello".valueOf(); //"hello"

var n = 123; a.valueOf(); //123 (在这个情况中,若直接使用123.valueOf();会报错:"SyntaxError: Unexpected token ILLEGAL ")

true.valueOf(); //true; 

 

JavaScript 数据类型转换