<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          談?wù)凧avaScript中裝箱和拆箱

          共 1893字,需瀏覽 4分鐘

           ·

          2020-12-06 11:37

          在JavaScript里面有個引用類型叫做基本包裝類型,它包括String、Number和Boolean。那么它和基本的類型String、Number和Boolean是啥關(guān)系呢?

          接著往下看?

          裝箱操作

          所謂的裝箱,是指將基本數(shù)據(jù)類型轉(zhuǎn)換為對應(yīng)的引用類型的操作。而裝箱又分為隱式裝箱和顯式裝箱。

          隱式裝箱

          對于隱式裝箱,我們看下下面的代碼:

          var?s1?=?'call_me_R';?//?隱式裝箱
          var?s2?=?s1.substring(2);

          上面代碼的執(zhí)行步驟其實是這樣的:

          創(chuàng)建String類型的一個實例;

          在實例中調(diào)用制定的方法;

          銷毀這個實例。

          上面的三個步驟轉(zhuǎn)換為代碼,如下:

          #?1
          var?s1?=?new?String('call_me_R');
          #?2
          var?s2?=?s1.substring(2);
          #?3
          s1?=?null;

          隱式裝箱當(dāng)讀取一個基本類型值時,后臺會創(chuàng)建一個該基本類型所對應(yīng)的基本包裝類型對象。在這個基本類型的對象上調(diào)用方法,其實就是在這個基本類型對象上調(diào)用方法。這個基本類型的對象是臨時的,它只存在于方法調(diào)用那一行代碼執(zhí)行的瞬間,執(zhí)行方法后立即被銷毀。這也是在基本類型上添加屬性和方法會不識別或報錯的原因了,如下:

          var?s1?=?'call_me_R';
          s1.job?=?'frontend?engineer';
          s1.sayHello?=?function(){
          ?console.log('hello?kitty');
          }
          console.log(s1.job);?//?undefined
          s1.sayHello();?//?Uncaught?TypeError:?s1.sayHello?is?not?a?function

          顯示裝箱

          裝箱的另一種方式是顯示裝箱,這個就比較好理解了,這是通過基本包裝類型對象對基本類型進(jìn)行顯示裝箱,如下:

          var?name?=?new?String('call_me_R');

          顯示裝箱的操縱可以對new出來的對象進(jìn)行屬性和方法的添加啦,因為通過通過new操作符創(chuàng)建的引用類型的實例,在執(zhí)行流離開當(dāng)前作用域之前一直保留在內(nèi)存中。

          var?objStr?=?new?String('call_me_R');
          objStr.job?=?'frontend?engineer';
          objStr.sayHi?=?function(){
          ?console.log('hello?kitty');
          }
          console.log(objStr.job);?//?frontend?engineer
          objStr.sayHi();?//?hello?kitty

          拆箱操作

          拆箱就和裝箱相反了。拆箱是指把引用類型轉(zhuǎn)換成基本的數(shù)據(jù)類型。通常通過引用類型的valueOf()和toString()方法來實現(xiàn)。

          在下面的代碼中,留意下valueOf()和toString()返回值的區(qū)別:

          var?objNum?=?new?Number(64);
          var?objStr?=?new?String('64');
          console.log(typeof?objNum);?//?object
          console.log(typeof?objStr);?//?object
          #?拆箱
          console.log(typeof?objNum.valueOf());?//?number?基本的數(shù)字類型,想要的
          console.log(typeof?objNum.toString());?//?string?基本的字符類型,不想要的
          console.log(typeof?objStr.valueOf());?//?string?基本的數(shù)據(jù)類型,不想要的
          console.log(typeof?objStr.toString());?//?string?基本的數(shù)據(jù)類型,想要的

          所以,在進(jìn)行拆箱操作的過程中,還得結(jié)合下實際的情況進(jìn)行拆箱,別盲目來 -- 吃力不討好就很尷尬了?

          后話

          文章首發(fā):github.com/reng99/blog…

          更多內(nèi)容:github.com/reng99/blog…

          參考

          • JavaScript 基本類型的裝箱與拆箱
          • 《JavaScript高級程序設(shè)計》

          作者:Jimmy 鏈接:https://juejin.cn/post/6844903859765133320


          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久黄免费 | 国产精品秘 | 永久免费 看片直接下载 | 在线观看欧美日本a | 微拍福利手机在线 |