日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁編程開發(fā)javascript|JQuery → Javascript中valueOf與toString方法分析

      Javascript中valueOf與toString方法分析

      相關(guān)軟件相關(guān)文章發(fā)表評論 來源:本站整理時間:2010/10/2 23:11:19字體大。A-A+

      作者:佚名點擊:338次評論:0次標(biāo)簽: valueOf

      • 類型:音頻處理大小:1M語言:中文 評分:5.1
      • 標(biāo)簽:
      立即下載
      最后群里討論一些怪題,有高手就想歪腦想hack這兩個東西了,雖然最后失敗了,但這精神是非常值得鼓勵的。于是決定寫一篇文章專門來介紹它們。

      基本上,所有JS數(shù)據(jù)類型都擁有這兩個方法,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

      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


      之所以有這樣的結(jié)果,因為它們偷偷地調(diào)用valueOf或toString方法。但如何區(qū)分什么情況下是調(diào)用了哪個方法呢,我們可以通過另一個方法測試一下。由于用到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

      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

      乍一看結(jié)果,大抵給人的感覺是,如果轉(zhuǎn)換為字符串時調(diào)用toString方法,如果是轉(zhuǎn)換為數(shù)值時則調(diào)用valueOf方法,但其中有兩個很不和諧。一個是alert(''+bbb),字符串合拼應(yīng)該是調(diào)用toString方法……另一個我們暫時可以理解為===操作符不進(jìn)行隱式轉(zhuǎn)換,因此不調(diào)用它們。為了追究真相,我們需要更嚴(yán)謹(jǐn)?shù)膶嶒灐?br />
      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

      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

      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


      發(fā)現(xiàn)有點不同吧?!它沒有像上面toString那樣統(tǒng)一規(guī)整。對于那個[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

      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


      如果只重寫了toString,對象轉(zhuǎn)換時會無視valueOf的存在來進(jìn)行轉(zhuǎn)換。但是,如果只重寫了valueOf方法,在要轉(zhuǎn)換為字符串的時候會優(yōu)先考慮valueOf方法。在不能調(diào)用toString的情況下,只能讓valueOf上陣了。對于那個奇怪的字符串拼接問題,可能是出于操作符上,翻開ECMA262-5 發(fā)現(xiàn)都有一個getValue操作。嗯,那么謎底應(yīng)該是揭開了。重寫會加大它們調(diào)用的優(yōu)化高,而在有操作符的情況下,valueOf的優(yōu)先級本來就比toString的高。

        相關(guān)評論

        閱讀本文后您有什么感想? 已有人給出評價!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)