新聞中心
1. 基本類型和引用類型
1.1 基本類型

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出樂山免費(fèi)做網(wǎng)站回饋大家。
js中基本數(shù)據(jù)類型包含:Number(數(shù)值)、String(字符串)、Boolean(布爾值)、Null、Undefined、Symbol(ES6引入的,表示獨(dú)一無二的),其有以下特點(diǎn):
- 基本類型的訪問是按值訪問的;
- 不能添加屬性和方法;
- 基本類型的變量時(shí)存在放棧區(qū)的,包括變量標(biāo)識符和變量的值。(棧區(qū)不會設(shè)置太大,主要用來存在基本類型);
- 基本類型的復(fù)制就是在棧內(nèi)存中開辟一個(gè)新的存儲區(qū)域來存儲新的變量;
- 基本類型的比較是值比較的。
image.png
1.2 引用類型
js中引用類型包含三類:
- 基本引用類型:Object(對象)、Array、RegExp、Date、Function;
- 基本包裝類型:String、Number、Boolean;
- 單體內(nèi)置對象:Global、Math。
其具有以下特點(diǎn):
- 引用類型的值是按引用訪問的;
- 引用類型可以擁有屬性和方法,且可動態(tài)改變;
- 存儲需要內(nèi)存的棧區(qū)和堆區(qū),其中棧區(qū)保存變量標(biāo)識符和指向內(nèi)存中該對象的指針;
- 引用類型的比較是引用的比較;
- 引用類型的復(fù)制將復(fù)制引用地址。
image.png
1.3 擴(kuò)展——為什么需要“?!焙汀岸选眱蓚€(gè)存儲空間
因?yàn)镴avaScript引擎需要用棧來維護(hù)程序執(zhí)行期間上下文的狀態(tài)(調(diào)用棧),如果??臻g太大的話(即所有數(shù)據(jù)都存儲在??臻g中),會影響上下文的切換效率,進(jìn)而影響整個(gè)程序的執(zhí)行效率,所以通常情況下??臻g不會設(shè)置太大,用于存儲基本類型這樣的小數(shù)據(jù),而引用類型將存儲到堆中。
2.包裝對象
2.1 背景
有一個(gè)奇怪的現(xiàn)象不知道大家注意過沒有,字符串、數(shù)字、布爾值都能夠調(diào)用屬性和方法,例如:
- const str = '123';
- console.log(typeof(str)); // string
- console.log(str.toString()); // 123
- const num = 123;
- console.log(typeof(num)); // number
- console.log(num.toString()); // 123
- const bool = true;
- console.log(typeof(bool)); // boolean
- console.log(bool.toString()); // true
看到這個(gè)現(xiàn)象,大家是不是感覺很奇怪,這與我們平時(shí)的想法是相悖的,畢竟我們認(rèn)為基本類型上面是不存在屬性和方法的,這個(gè)時(shí)候主角包裝對象就出現(xiàn)了。
2.2 包裝對象
JS 的數(shù)值,布爾,字符串類型的變量,在一定條件下,也可以自動變成對象,這就是原始類型的包裝對象。包裝對象其實(shí)是一種特殊的引用類型,其與引用類型的主要區(qū)別在于生命周期。
一般的引用類型在使用new創(chuàng)建其實(shí)例時(shí),在執(zhí)行流離開當(dāng)前作用域之前一直都保存在內(nèi)存中;
包裝類型的對象只存在該行代碼的執(zhí)行瞬間,然后會立即被銷毀。(也意味著在運(yùn)行時(shí)不能為基本類型添加屬性和方法)
2.3 包裝對象后臺執(zhí)行流程
基本類型中的String、Number、Boolean在調(diào)用屬性和方法的時(shí)候,后臺是怎樣執(zhí)行的呢?其實(shí)整個(gè)過程可以簡化為三步:
- 創(chuàng)建一個(gè)對象類型的實(shí)例,例如字符串則創(chuàng)建一個(gè)String類型的實(shí)例;
- 調(diào)用該實(shí)例對象上的特定方法;
- 銷毀該實(shí)例。
以字符串為例,來演示該流程:
- const str = 'abc';
- const strNew = str.substring(0, 2);
在運(yùn)行到str.substring(0, 2)的時(shí)候其實(shí)偷偷執(zhí)行了以下三步:
- let strObj = new String(str);
- const strNew = strObj.substring(0, 2);
- strObj = null;
2.4 擴(kuò)展
- 包裝對象和同樣的原始類型的值相等嗎?
不相等。因?yàn)榘b對象是引用類型,原始類型是基本類型;包裝對象的最大目的,首先是使得 JavaScript 的對象涵蓋所有的值,其次使得原始類型的值可以方便地調(diào)用某些方法。
- 如何給基本類型添加屬性和方法?
在基本包裝對象的原型下面添加,每個(gè)對象都有原型。
- 同一個(gè)字符串調(diào)用兩次相同的方法其包裝對象相等嗎?
不相等。調(diào)用結(jié)束后,包裝對象實(shí)例會自動銷毀。這意味著,下一次調(diào)用字符串的屬性時(shí),實(shí)際是調(diào)用一個(gè)新生成的對象,而不是上一次調(diào)用時(shí)生成的那個(gè)對象,這也說明了為什么不能直接給字符串、數(shù)字、布爾值添加屬性和方法。
本文轉(zhuǎn)載自微信公眾號「執(zhí)鳶者」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系執(zhí)鳶者公眾號。
分享題目:前端百題斬——從基本類型、引用類型到包裝對象
URL鏈接:http://fisionsoft.com.cn/article/ccsghsd.html


咨詢
建站咨詢
