类型转换,对象常见的两个方法是toString()和valueOf().
- toString()方法返回反映这个对象的字符串.
- valueOf()方法简单地返回对象本身,而不是返回一个原始值
【1】undefined和null没有toString()方法和valueOf()方法
undefined.valueOf();//错误
null.valueOf();//错误
undefined.toString();//错误
null.toString();//错误
【2】布尔型数据true和false,toString()返回对应的’true’和’false’,valueOf()返回原值
true.valueOf();//true
typeof true.valueOf();//'boolean'
false.valueOf();//false
typeof false.valueOf();//'boolean'
Boolean.valueOf();//Boolean() { [native code] }
typeof Boolean.valueOf();//'function'
true.toString();//'true'
false.toString();//'false'
Boolean.toString();//"function Boolean() { [native code] }"
【3】字符串类型:都返回原值
'1'.valueOf();//'1'
''.valueOf();//''
'abc'.valueOf();//'abc'
String.valueOf();//String() { [native code] }
typeof String.valueOf();//'function'
'1'.toString();//'1'
''.toString();//''
'abc'.toString();//'abc'
String.toString();//"function String() { [native code] }"
【4】数值类型
- valueOf()
Number.valueOf();//Number() { [native code] }
typeof Number.valueOf();//'function'
1、整数直接跟.valueOf()形式,会报错,提示无效标记,因为整数后的点被识别为小数点,所以尽量加括号
0.valueOf();//Uncaught SyntaxError: Invalid or unexpected token
(0).valueOf();//0
+0.valueOf();//Uncaught SyntaxError: Invalid or unexpected token
(+0).valueOf();//0
-0.valueOf();//Uncaught SyntaxError: Invalid or unexpected token
(-0).valueOf();//-0
[注意]-0的valueOf()值是-0,而-0的toString()值是’0’
2、浮点数原值返回
1.23.valueOf();//1.23
+1.23.valueOf();//1.23
-1.23.valueOf();//-1.23
NaN.valueOf();//NaN
Infinity.valueOf();//Infinity
-Infinity.valueOf();//-Infinity
[注意]和toString()不同的是,valueOf()不可以接收转换基数 - toString()
Number.toString();//"function Number() { [native code] }"
1、正浮点数及NaN、Infinity加引号返回
1.23.toString();//'1.23'
NaN.toString();//'NaN'
Infinity.toString();//'Infinity'
2、负浮点数或加’+'号的正浮点数直接跟上.toString(),相当于先运行toString()方法,再添加正负号,转换为数字
+1.23.toString();//1.23
typeof +1.23.toString();//'number'
-1.23.toString();//-1.23
typeof -1.23.toString();//'number'
3、整数直接跟上.toString()形式,会报错,提示无效标记,因为整数后的点会被识别为小数点
0.toString();//Uncaught SyntaxError: Invalid or unexpected token
因此,为了避免以上无效及报错的情况,数字在使用toString()方法时,加括号可解决
(0).toString();//'0'
(-0).toString();//'0'
(+1.2).toString();//'1.2'
(-1.2).toString();//'-1.2'
(NaN).toString();//'NaN'
此外,数字类型的toString()方法可以接收表示转换基数(radix)的可选参数,如果不指定此参数,转换规则将是基于十进制。同样,也可以将数字转换为其他进制数(范围在2-36)
var n = 17;
n.toString();//'17’n.toString(2);//'10001’
n.toString(8);//'21’
n.toString(10);//'17’
n.toString(12);//'15’
n.toString(16);//‘11’`
【5】对象Object类型及自定义对象类型:toString()返回[object Object],valueOf()返回原对象
{}.valueOf();//报错,Unexpected token .
({}).valueOf();//Object{}
typeof ({}).valueOf();//'object'
({a:123}).valueOf();//Object{a:123}
Object.valueOf();//Object() { [native code] }
typeof Object.valueOf();//'function'
function Person(){ this.name = 'test'; }
var person1 = new Person();
person1.valueOf();//Person {name: "test"}
{}.toString();//报错,Unexpected token .
({}).toString();//[object Object]
({a:123}).toString();//[object Object]
Object.toString();//"function Object() { [native code] }"
function Person(){ this.name = 'test'; }
var person1 = new Person();
person1.toString();//"[object Object]"
【6】函数Function类型都返回原函数
function test(){ alert(1);//1 }
test.valueOf();/*function test(){ alert(1);//1 }*/
Function.valueOf();//Function() { [native code] }
function test(){ alert(1);//test }
test.toString();/*"function test(){ alert(1);//test }"*/
Function.toString();//"function Function() { [native code] }"
【7】数组Array类型:valueOf()返回原对象,toString()返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串
[].valueOf();//[]
[1].valueOf();//[1]
[1,2,3,4].valueOf();//[1,2,3,4]
Array.valueOf();//Array() { [native code] }
[].toString();//''
[1].toString();//'1'
[1,2,3,4].toString();//'1,2,3,4'
Array.toString();//"function Array() { [native code] }"
【8】时间Date类型:toString()返回表示当前时区的时间的字符串表示,valueOf()返回返回一个数字值,它是当前时间值
Date.now();//1465115123742
(new Date()).valueOf();//1465115123742
typeof (new Date()).valueOf();//'number'
Date.valueOf();//Date() { [native code] }
(new Date()).toString();//"Sun Jun 05 2016 10:04:53 GMT+0800 (中国标准时间)"
Date.toString();//"function Date() { [native code] }"
valueOf()方法返回的是现在到1970年1月1日00:00:00的数值类型的毫秒数