国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Javascript中valueOf與toString區別淺析

2024-05-06 14:19:14
字體:
來源:轉載
供稿:網友

前言

基本上,所有JS數據類型都擁有這兩個方法,null除外。它們倆解決javascript值運算與顯示的問題,重寫會加大它們調用的優化。

測試分析

先看一例:
代碼如下:
var aaa = {
 i: 10,
 valueOf: function() { return this.i+30; },
 toString: function() { return this.valueOf()+10; }
}

alert(aaa > 20); // true
alert(+aaa); // 40
alert(aaa); // 50

之所以有這樣的結果,因為它們偷偷地調用valueOf或toString方法。
但如何區分什么情況下是調用了哪個方法呢,我們可以通過另一個方法測試一下。
由于用到console.log,請在裝有firebug的FF中實驗!
代碼如下:
var bbb = {
 i: 10,
 toString: function() {
  console.log('toString');
  return this.i;
 },
 valueOf: function() {
  console.log('valueOf');
  return this.i;
 }
}

alert(bbb);// 10 toString
alert(+bbb); // 10 valueOf
alert(''+bbb); // 10 valueOf
alert(String(bbb)); // 10 toString
alert(Number(bbb)); // 10 valueOf
alert(bbb == '10'); // true valueOf
alert(bbb === '10'); // false

結果給人的感覺是,如果轉換為字符串時調用toString方法,如果是轉換為數值時則調用valueOf方法,但其中有兩個很不和諧。一個是alert(''+bbb),字符串合拼應該是調用toString方法……另一個我們暫時可以理解為===操作符不進行隱式轉換,因此不調用它們。為了追究真相,我們需要更嚴謹的實驗。
代碼如下:
var aa = {
 i: 10,
 toString: function() {
  console.log('toString');
  return this.i;
 }
}
alert(aa);// 10 toString
alert(+aa); // 10 toString
alert(''+aa); // 10 toString
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 toString
alert(aa == '10'); // true toString

再看valueOf。
代碼如下:
var bb = {
 i: 10,
 valueOf: function() {
  console.log('valueOf');
  return this.i;
 }
}

alert(bb);// [object Object]
alert(+bb); // 10 valueOf
alert(''+bb); // 10 valueOf
alert(String(bb)); // [object Object]
alert(Number(bb)); // 10 valueOf
alert(bb == '10'); // true valueOf

發現有點不同吧?!它沒有像上面toString那樣統一規整。
對于那個[object Object],我估計是從Object那里繼承過來的,我們再去掉它看看。
代碼如下:
Object.prototype.toString = null;
var cc = {
 i: 10,
 valueOf: function() {
  console.log('valueOf');
  return this.i;
 }
}


alert(cc);// 10 valueOf
alert(+cc); // 10 valueOf
alert(''+cc); // 10 valueOf
alert(String(cc)); // 10 valueOf
alert(Number(cc)); // 10 valueOf
alert(cc == '10'); // true valueOf

總結:valueOf偏向于運算,toString偏向于顯示。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 会东县| 曲松县| 邮箱| 宁夏| 楚雄市| 肇庆市| 贵德县| 威海市| 承德县| 福海县| 尉犁县| 顺义区| 巧家县| 安泽县| 安泽县| 龙里县| 武冈市| 漳州市| 静乐县| 崇信县| 西畴县| 靖江市| 武定县| 长阳| 乌兰察布市| 清河县| 靖州| 吐鲁番市| 张家川| 万山特区| 银川市| 凉山| 昌平区| 定西市| 游戏| 青神县| 靖宇县| 麟游县| 渑池县| 安泽县| 中江县|