除基本數據類型以外的全部類型都爲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。