標籤:是什麼 類型 this 疑問 test javascrip can value 調用
疑問:
在JS的資料類型中有兩個方法 Object.prototype.valueOf 和 Object.prototype.toString,在執行個體到這兩個的區別是什嗎?
我們進行如下的執行個體步驟:
案例1.
var test={ age:20, toString:function(){return this.age-10;}, //重寫 toString() valueOf:function(){return this.age+40;} //重寫 valueOf() }
運行如下代碼:
alert(test>20);//true 調用的是 valueOf alert(+test); //60 調用的是 valueOf alert(test); //10 調用的是 toString
結論:出現這種結果是由於test在自動的調用 valueOf 或者 toString 方法.
此時產生了新的疑問:什麼情況下調用 valueOf,什麼情況下調用 toString 呢?
繼續看下面的案例:
案例2.
var test={ age:20, toString:function(){console.log(‘toString‘);return this.age-10;}, //重寫 toString() valueOf:function(){console.log(‘valueOf‘);return this.age+40;} //重寫 valueOf() }
運行如下代碼:
alert(test);// 10 toString alert(+test); // 60 valueOf alert(‘‘ + test); // 60 valueOf alert(String(test)); // 10 toString alert(Number(test)); // 60 valueOf alert(test == ‘10‘); // false valueOf alert(test === ‘10‘); // false
結論:轉換成字串時調用的是 toString,轉換成數字時調用的是 valueOf,但是有兩個例外:一個alert(‘‘ + test),已改調用 toString ,反而卻調用的是 valueOf, 另外一個 alert(test === ‘10‘),===操作符不進行隱式轉換,因此不調用它們。
為了弄清楚兩個例外,我們繼續案例:
案例3:
var test = { age: 20, toString: function () { console.log(‘toString‘); return this.age - 10; } //重寫 toString() }
運行如下代碼:
alert(test);// 10 toString alert(+test); // 10 toString alert(‘‘ + test); // 10 toString alert(String(test)); // 10 toString alert(Number(test)); // 10 toString alert(test == ‘10‘); // true toString alert(test === ‘10‘); // false
結論:只重寫 toString 的時候,調用的是 toString.
案例4:
var test = { age: 20, valueOf: function () { console.log(‘valueOf‘); return this.age + 40; } //重寫 valueOf() }
運行如下代碼:
alert(test);// [object object] --繼承的是 Object.prototype.toString alert(+test); // 60 valueOf alert(‘‘ + test); // 60 valueOf alert(String(test)); // [object object] --Object.prototype.toString alert(Number(test)); // 60 valueOf alert(test == ‘10‘); // false valueOf alert(test === ‘10‘); // false
結論:對於那個[object Object],我估計是從Object那裡繼承過來的,我們再去掉它看看。
案例5:
Object.prototype.toString = null; var test = { age: 20, valueOf: function () { console.log(‘valueOf‘); return this.age + 40; } //重寫 valueOf() } alert(test);// 60 valueOf alert(+test); // 60 valueOf alert(‘‘ + test); // 60 valueOf alert(String(test)); // 60 valueOf alert(Number(test)); // 60 valueOf alert(test == ‘10‘); // false valueOf alert(test === ‘10‘); // false
案例6:
var test = { age: 20 } alert(test);// [object object] alert(+test); // NaN alert(‘‘ + test); // [object object] alert(String(test)); // [object object] alert(Number(test)); // NaN alert(test == ‘10‘); // false alert(test === ‘10‘); // false
案例7:
Object.prototype.toString = null; var test = { age: 20 } alert(test);// Uncaught TypeError: Cannot convert object to primitive value alert(+test); // Uncaught TypeError: Cannot convert object to primitive value alert(‘‘ + test); // Uncaught TypeError: Cannot convert object to primitive value alert(String(test)); // Uncaught TypeError: Cannot convert object to primitive value alert(Number(test)); // Uncaught TypeError: Cannot convert object to primitive value alert(test == ‘10‘); // Uncaught TypeError: Cannot convert object to primitive value alert(test === ‘10‘); //false Uncaught TypeError: Cannot convert object to primitive value
從上面所有的案例中總結:
1.valueOf應用於運算,toString應用於顯示.
2.在進行對象轉換成字串時(例如:alert(test)),將優先調用 toString,如果沒有 toString 方法了,就調用 valueOf方法,如果tostring 和 valueOf都沒重寫,就按照 Object的toString 方法輸出.
3.在進行強轉字串類型時將優先調用toString方法,強轉為數字時優先調用valueOf。
4.在有運算操作符的情況下,valueOf的優先順序高於toString。
Javascript中valueOf與toString區別