亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文帶你深入理解JavaScript對(duì)象與包裝類

 更新時(shí)間:2024年06月14日 08:20:36   作者:常樂hhh  
想當(dāng)然,大家都認(rèn)識(shí)JS中的對(duì)象,也知道一些對(duì)象的實(shí)現(xiàn)方法,所以在了解包裝類之前,我們將來對(duì)象的實(shí)現(xiàn)方法大概的來回想一下,更感興趣的小伙伴跟著小編一起來看看吧

對(duì)象的創(chuàng)建方式

  • 對(duì)象字面量:最直接的方式,通過鍵值對(duì)的形式定義對(duì)象。
var mrPeng = {
    name: '彭于晏',
    age: 18,
    sex: 'boy',
};
  • new Object() :構(gòu)造函數(shù)方式創(chuàng)建一個(gè)空對(duì)象。
var obj = new Object();
  • 自定義構(gòu)造函數(shù):通過new關(guān)鍵字調(diào)用自定義的構(gòu)造函數(shù)來創(chuàng)建特定類型的對(duì)象。
function Car(name, height) {
    this.name = name;
    this.height = height;
}
var car = new Car('Toyota', 1500);
  • 模擬構(gòu)造函數(shù):模擬一個(gè)構(gòu)造函數(shù),但不使用new關(guān)鍵字,需手動(dòng)實(shí)現(xiàn)。
function Person(name, age){
    var self = {};
    self.name = name;
    self.age = age;
    return self;
}
let p = Person('Alice', 30);

包裝類

進(jìn)度一

先來看看這段JS代碼:

   var num = 123;
   num.a = 'aaa'; 
   console.log(num.a); // undefined

簡(jiǎn)單解釋一下代碼:代碼中先聲明了一個(gè)Num,并賦值為123,再在Num上掛上一個(gè)屬性a,其值為字符串aaa,然后打印輸出Numa的值

如果你也是這樣想的話,那么你心中輸出的結(jié)果不就是字符串aaa嘛。可是輸出的結(jié)果真的是字符串aaa嗎???

當(dāng)然不是,我可以清楚的告訴你,該段代碼輸出的是undefined。說明屬性a并沒有掛在num上,畢竟num不是對(duì)象,那竟然沒掛上去,訪問不存在的東西時(shí),不應(yīng)該報(bào)錯(cuò)嗎?那又為什么輸出的是undefined呢?

首先,我們通過該段代碼能知道:在JS中原始值(原始類型數(shù)據(jù))(如數(shù)字Number、字符串String、布爾值boolean等)不能擁有屬性和方法,屬性和方法只有對(duì)象才能擁有。

那么如果我們將var num = 123;改寫成var num = new Number(123);呢,我們就得到了一個(gè)對(duì)象,可是對(duì)象里面沒有key,只有一個(gè)值為123。展開Number(123)這個(gè)對(duì)象看一下,就會(huì)看到有一個(gè)[[PrimitiveValue]]:123,意思就是說這是一種特殊的對(duì)象Number(123),這個(gè)對(duì)象就是我們說的包裝類

你說他是對(duì)象他就是對(duì)象,你說他是數(shù)字他也是數(shù)字,他能當(dāng)成數(shù)字來用。

   var num = new Number(123);
   console.log(num*2);// 輸出246
   num.a = 'aaa'; 
   console.log(num.a); //輸出aaa

這就說明當(dāng)你將他用來當(dāng)對(duì)象,他就是對(duì)象,用來當(dāng)數(shù)字,他就是數(shù)字。

var num = 123;這種創(chuàng)建的叫數(shù)字字面量,而var num = new Number(123);創(chuàng)建的叫Number對(duì)象(數(shù)字對(duì)象)。對(duì)象是可以有屬性和方法的,而原始值是沒有的。

進(jìn)度二

讓我們來看看先這段代碼:

var str ='asdf'   
console.log(str.length)  //輸出4

為什么這個(gè)能輸出4呢?總不能說剛剛得到的結(jié)論是錯(cuò)的吧

在解決上面這個(gè)問題前先來看看這段代碼:

   var num = 4;
   num.len = 3; //
   console.log(num.len); // undefined

根據(jù)上面的結(jié)論,我們能知道這里的 len是不能掛在原始值上的,輸出的肯定是undefined,沒錯(cuò)吧。

我們來解析一下上面那段代碼,看看在v8引擎是怎樣實(shí)現(xiàn)的:

  • 首先,在執(zhí)行var num = 4;時(shí) ,v8會(huì)將代碼執(zhí)行為new Number(4),也就是所有的字面量都會(huì)執(zhí)行成這個(gè)樣子,包括字符串和布爾會(huì)執(zhí)行成new String()new Boolean() ,將其轉(zhuǎn)換為對(duì)象,也就是包裝類。
  • 然后,v8在執(zhí)行這個(gè)代碼num.len = 3;時(shí),就會(huì)將len屬性掛在Number這個(gè)對(duì)象上,且值為3。因?yàn)樵贘S中數(shù)字對(duì)象就是為了彌補(bǔ)數(shù)字字面量的不足,在JS中萬物皆對(duì)象,所有的東西都要往對(duì)象上靠
  • 最后,在執(zhí)行console.log(num.len);之前就會(huì)突然醒悟過來,也就是在讀取該值或在執(zhí)行前會(huì)使用 str.valueof()方法 ,判斷這個(gè)對(duì)象(數(shù)字對(duì)象)是否能轉(zhuǎn)化為原始值(str.valueof()方法只能操作包裝類),如果能轉(zhuǎn)化為原始值,那么就會(huì)將屬性和方法移除,執(zhí)行delete num.len。然而在輸出的時(shí)候,num.len先在Number對(duì)象中查找,找不到就會(huì)聲明一個(gè)len屬性再對(duì)象中,但是沒有值啊,所以輸出的就是undefined,而不不是報(bào)錯(cuò)?。?!

訪問對(duì)象不存在的屬性,會(huì)返回undefined

訪問不存在的不變量,會(huì)報(bào)錯(cuò)?。?/strong>

那么現(xiàn)在我們來解決上面那個(gè)問題:

var str ='asdf'   
console.log(str.length)  //輸出4
  • 首先,一樣的,在執(zhí)行var str ='asdf' 時(shí),v8會(huì)執(zhí)行為var str =new String('asdfg')包裝類
  • 然后,str調(diào)用length方法,并且輸出,他沒有往原始值上掛屬性,直接調(diào)用的話,會(huì)去對(duì)象(包裝類)中查找該方法,找不到該方法就會(huì)去,該對(duì)象的原型上找,也就是我們之前提到的,按照他的原型鏈去查找該方法,而String這個(gè)構(gòu)造函數(shù)中是有該方法的,可以直接調(diào)用。

總結(jié)

  • 包裝類String, Number, Boolean)是JavaScript為原始值提供的對(duì)象包裝器,允許我們像操作對(duì)象一樣操作原始值,包括訪問屬性和方法,只不過屬性和方法并不是原始值身上的,而是String, Number, Boolean的構(gòu)造函數(shù)(對(duì)象)上的。

  • 原始值是不能擁有屬性和方法,屬性和方法只有對(duì)象才能擁有

  • 重要特性:每當(dāng)試圖訪問原始值的屬性或方法時(shí),JavaScript會(huì)自動(dòng)創(chuàng)建包裝類,執(zhí)行完畢后立即銷毀,確保原始值的不變性。這就是為什么直接給原始值添加屬性沒有效果的原因。

  • valueOf():為了使 valueOf 在類型轉(zhuǎn)換過程中有用,它必須返回一個(gè)原始值(基本類型值)。所有的原始類型(基本類型)都有自己的 valueOf() 方法。JavaScript 調(diào)用 valueOf 方法來將對(duì)象轉(zhuǎn)換成原始值(基本類型值)。你很少需要自己調(diào)用 valueOf 方法;當(dāng)遇到需要基本類型值的對(duì)象時(shí),JavaScript 會(huì)自動(dòng)的調(diào)用該方法。

  • 原始值對(duì)象,v8 執(zhí)行到包裝類時(shí),會(huì)通過valueOf()試探該包裝類是不是原始值,如果是,則秉承原始值不用具有屬性和方法的這一規(guī)則,再移除掉給包裝類添加的屬性

以上就是深入理解JavaScript對(duì)象與包裝類的詳細(xì)內(nèi)容,更多關(guān)于JavaScript對(duì)象與包裝類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • echarts自定義tooltip中的內(nèi)容代碼示例

    echarts自定義tooltip中的內(nèi)容代碼示例

    在ECharts中,通過formatter函數(shù)自定義圖例樣式,可以實(shí)現(xiàn)更靈活的圖表展示,滿足特定的視覺需求,這篇文章主要介紹了echarts自定義tooltip中內(nèi)容的相關(guān)資料,需要的朋友可以參考下
    2024-10-10
  • js上下視差滾動(dòng)簡(jiǎn)單實(shí)現(xiàn)代碼

    js上下視差滾動(dòng)簡(jiǎn)單實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了js上下視差滾動(dòng)的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 在weex中愉快的使用scss的方法步驟

    在weex中愉快的使用scss的方法步驟

    這篇文章主要介紹了在weex中愉快的使用scss的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • JavaScript 學(xué)習(xí)筆記(四)

    JavaScript 學(xué)習(xí)筆記(四)

    今天繼續(xù)學(xué)習(xí)JS中的對(duì)象,昨天學(xué)完了本地對(duì)象中的兩個(gè)重要對(duì)象Array和Date。今天看下內(nèi)置對(duì)象Global對(duì)象和Math對(duì)象。
    2009-12-12
  • ES6字符串的擴(kuò)展實(shí)例

    ES6字符串的擴(kuò)展實(shí)例

    這篇文章主要介紹了ES6字符串的擴(kuò)展實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 分享我對(duì)JS插件開發(fā)的一些感想和心得

    分享我對(duì)JS插件開發(fā)的一些感想和心得

    這篇文章主要給大家分享我對(duì)JS插件開發(fā)的一些感想和心得的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • js實(shí)現(xiàn)九宮格抽獎(jiǎng)

    js實(shí)現(xiàn)九宮格抽獎(jiǎng)

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)九宮格抽獎(jiǎng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Vuejs通過拖動(dòng)改變?cè)貙挾葘?shí)現(xiàn)自適應(yīng)

    Vuejs通過拖動(dòng)改變?cè)貙挾葘?shí)現(xiàn)自適應(yīng)

    這篇文章主要介紹了Vuejs通過拖動(dòng)改變?cè)貙挾葘?shí)現(xiàn)自適應(yīng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • javascript 產(chǎn)生隨機(jī)數(shù)的幾種方法總結(jié)

    javascript 產(chǎn)生隨機(jī)數(shù)的幾種方法總結(jié)

    這篇文章主要介紹了javascript 產(chǎn)生隨機(jī)數(shù)的幾種方法總結(jié)的相關(guān)資料,希望通過本文大家能夠掌握如何實(shí)現(xiàn)這樣的方法,需要的朋友可以參考下
    2017-09-09
  • JavaScript通如何過RGraph實(shí)現(xiàn)動(dòng)態(tài)儀表盤

    JavaScript通如何過RGraph實(shí)現(xiàn)動(dòng)態(tài)儀表盤

    這篇文章主要介紹了JavaScript通如何過RGraph實(shí)現(xiàn)動(dòng)態(tài)儀表盤,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論