首页 > 代码库 > 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
上面代码的执行过程如下:
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
toString: function() {
console.log("toString");
return {};
},
valueOf: function() {
console.log("toString");
return {};
}
}
Number(obj);
上述代码中,valueOf方法和toString方法返回的都是对象,因此转换时出错。
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 数据类型转换