除基本数据类型以外的全部类型都为Object类型。
toString方法通常返回一个反映这个对象的字符串
//通常对象 var obj = {name:'jack',age:18}; console.log(typeof obj.toString(),obj.toString()); //数组 var arr = ['zero','one','two']; console.log(typeof arr.toString(),arr.toString()); //函数 var fun = function(a,b){ return a+b; }; console.log(typeof fun.toString(),fun.toString()); //正则表达式 var reg = /\s+/; console.log(typeof reg.toString(),reg.toString()); //日期 var d = new Date(); console.log(typeof d.toString(),d.toString());
测试结果
正则表达式
通常默认返回对象自己,Date类重写了valueOf方法,其返回1970年1月1日以来的毫秒数
var obj = {name:'jack',age:18}; console.log(typeof obj.valueOf(),obj.valueOf()); //数组 var arr = ['zero','one','two']; console.log(typeof arr.valueOf(),arr.valueOf()); //函数 var fun = function(a,b){ return a+b; }; console.log(typeof fun.valueOf(),fun.valueOf()); //正则表达式 var reg = /\s+/; console.log(typeof reg.valueOf(),reg.valueOf()); //日期 var d = new Date(); console.log(typeof d.valueOf(),d.valueOf());
测试结果
数组
这里的转换指的是显示类型转换,转换步骤为:函数
//test1的toString方法返回字符串'toString',valueOf方法返回字符串'valueof' var test1 = { toString:function() { console.log('调用了toString方法'); return 'tostring'; }, valueOf:function() { console.log('调用了valueOf方法'); return 'valueof'; } }; console.log(String(test1));
测试结果
能够看到这里优先调用了toString方法,返回了'tostring'测试
//test2的toString方法返回对象{},valueOf方法返回字符串'valueof' var test2 = { toString:function() { console.log('调用了toString方法'); return {}; }, valueOf:function() { console.log('调用了valueOf方法'); return 'valueof'; } }; console.log(String(test2));
测试结果:
能够看到这里先调用了toString方法,因为toString方法返回对象,接着又调用了valueOf方法,返回了'valueof' 。code
//test3的toString方法和valueOf方法均返回对象 var test3 = { toString:function() { console.log('调用了toString方法'); return {}; }, valueOf:function() { console.log('调用了valueOf方法'); return {}; } }; console.log(String(test3));
测试结果:
这里有与toString方法和valueOf方法均不返回原始值,因而抛出类型错误异常对象
这里的转换一样指的是显示类型转换,转换步骤为:图片
转换步骤测试:字符串
//这里test1的valueOf方法返回'123',toString方法返回'456' var test1 = { toString:function() { console.log('调用了toString方法'); return '456'; }, valueOf:function() { console.log('调用了valueof方法'); return '123'; } }; console.log(Number(test1));
测试结果:
能够看到test1先调用的valueOf方法,返回'123',并将'123',转换为了数字123string
//这里test2的valueOf方法返回对象{},toString方法返回'456' var test2 = { toString:function() { console.log('调用了toString方法'); return '456'; }, valueOf:function() { console.log('调用了valueOf方法'); return {}; } }; console.log(Number(test2));
测试结果:
能够看到test2先调用的valueOf方法,因为其返回的是一个对象,紧接着又调用了toString方法,返回'456',并将'456',转换为了数字456it
//这里test3的valueOf方法返回对象{}和toString方法返回对象{} var test3 = { toString:function() { console.log('调用了toString方法'); return {}; }, valueOf:function() { console.log('调用了valueOf方法'); return {}; } }; console.log(Number(test3));
测试结果:
能够看到test3先调用的valueOf方法和toString方法均返回对象,抛出类型错误异常
Boolean(obj) => true
- Number([]) => 0 这里[]先调用其valueOf方法,因为返回对象[],而后调用toString方法,返回'',再将''转换为数字0。 - Number([9]) => 9 这里[9]先调用其valueOf方法,因为返回对象[9],而后调用toString方法,返回'9',再将'9'转换为数字0。 - Number(['a']) => NaN 这里['a']先调用其valueOf方法,因为返回对象['a'],而后调用toString方法,返回'a',再将'a'转换为数字NaN。