自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

前端百題斬——從基本類型、引用類型到包裝對象

開發(fā) 后端
JS 的數(shù)值,布爾,字符串類型的變量,在一定條件下,也可以自動變成對象,這就是原始類型的包裝對象。

 [[399629]]

1. 基本類型和引用類型

1.1 基本類型

js中基本數(shù)據(jù)類型包含:Number(數(shù)值)、String(字符串)、Boolean(布爾值)、Null、Undefined、Symbol(ES6引入的,表示獨一無二的),其有以下特點:

  1. 基本類型的訪問是按值訪問的;
  2. 不能添加屬性和方法;
  3. 基本類型的變量時存在放棧區(qū)的,包括變量標(biāo)識符和變量的值。(棧區(qū)不會設(shè)置太大,主要用來存在基本類型);
  4. 基本類型的復(fù)制就是在棧內(nèi)存中開辟一個新的存儲區(qū)域來存儲新的變量;
  5. 基本類型的比較是值比較的。

image.png

1.2 引用類型

js中引用類型包含三類:

  1. 基本引用類型:Object(對象)、Array、RegExp、Date、Function;
  2. 基本包裝類型:String、Number、Boolean;
  3. 單體內(nèi)置對象:Global、Math。

其具有以下特點:

  1. 引用類型的值是按引用訪問的;
  2. 引用類型可以擁有屬性和方法,且可動態(tài)改變;
  3. 存儲需要內(nèi)存的棧區(qū)和堆區(qū),其中棧區(qū)保存變量標(biāo)識符和指向內(nèi)存中該對象的指針;
  4. 引用類型的比較是引用的比較;
  5. 引用類型的復(fù)制將復(fù)制引用地址。

image.png

1.3 擴(kuò)展——為什么需要“棧”和“堆”兩個存儲空間

因為JavaScript引擎需要用棧來維護(hù)程序執(zhí)行期間上下文的狀態(tài)(調(diào)用棧),如果??臻g太大的話(即所有數(shù)據(jù)都存儲在??臻g中),會影響上下文的切換效率,進(jìn)而影響整個程序的執(zhí)行效率,所以通常情況下??臻g不會設(shè)置太大,用于存儲基本類型這樣的小數(shù)據(jù),而引用類型將存儲到堆中。

2.包裝對象

2.1 背景

有一個奇怪的現(xiàn)象不知道大家注意過沒有,字符串、數(shù)字、布爾值都能夠調(diào)用屬性和方法,例如:

  1. const str = '123'
  2. console.log(typeof(str)); // string 
  3. console.log(str.toString()); // 123 
  4. const num = 123;  
  5. console.log(typeof(num)); // number 
  6. console.log(num.toString()); // 123 
  7. const bool = true
  8. console.log(typeof(bool)); // boolean 
  9. console.log(bool.toString()); // true 

看到這個現(xiàn)象,大家是不是感覺很奇怪,這與我們平時的想法是相悖的,畢竟我們認(rèn)為基本類型上面是不存在屬性和方法的,這個時候主角包裝對象就出現(xiàn)了。

2.2 包裝對象

JS 的數(shù)值,布爾,字符串類型的變量,在一定條件下,也可以自動變成對象,這就是原始類型的包裝對象。包裝對象其實是一種特殊的引用類型,其與引用類型的主要區(qū)別在于生命周期。

一般的引用類型在使用new創(chuàng)建其實例時,在執(zhí)行流離開當(dāng)前作用域之前一直都保存在內(nèi)存中;

包裝類型的對象只存在該行代碼的執(zhí)行瞬間,然后會立即被銷毀。(也意味著在運行時不能為基本類型添加屬性和方法)

2.3 包裝對象后臺執(zhí)行流程

基本類型中的String、Number、Boolean在調(diào)用屬性和方法的時候,后臺是怎樣執(zhí)行的呢?其實整個過程可以簡化為三步:

  1. 創(chuàng)建一個對象類型的實例,例如字符串則創(chuàng)建一個String類型的實例;
  2. 調(diào)用該實例對象上的特定方法;
  3. 銷毀該實例。

以字符串為例,來演示該流程:

  1. const str = 'abc'
  2. const strNew = str.substring(0, 2); 

在運行到str.substring(0, 2)的時候其實偷偷執(zhí)行了以下三步:

  1. let strObj = new String(str); 
  2. const strNew = strObj.substring(0, 2); 
  3. strObj = null

2.4 擴(kuò)展

  • 包裝對象和同樣的原始類型的值相等嗎?

不相等。因為包裝對象是引用類型,原始類型是基本類型;包裝對象的最大目的,首先是使得 JavaScript 的對象涵蓋所有的值,其次使得原始類型的值可以方便地調(diào)用某些方法。

  • 如何給基本類型添加屬性和方法?

在基本包裝對象的原型下面添加,每個對象都有原型。

  • 同一個字符串調(diào)用兩次相同的方法其包裝對象相等嗎?

不相等。調(diào)用結(jié)束后,包裝對象實例會自動銷毀。這意味著,下一次調(diào)用字符串的屬性時,實際是調(diào)用一個新生成的對象,而不是上一次調(diào)用時生成的那個對象,這也說明了為什么不能直接給字符串、數(shù)字、布爾值添加屬性和方法。

本文轉(zhuǎn)載自微信公眾號「執(zhí)鳶者」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系執(zhí)鳶者公眾號。

 

責(zé)任編輯:武曉燕 來源: 執(zhí)鳶者
相關(guān)推薦

2021-05-30 19:02:59

變量對象上下文

2021-10-19 22:23:05

typeof方式Instanceof

2021-05-09 22:00:59

TypeofInstanceof運算符

2021-05-19 07:02:42

JS對象方法

2021-06-16 07:03:37

New操作符函數(shù)

2021-07-26 06:57:58

重繪回流前端

2016-10-28 21:13:33

JavaScript基本包裝類型

2021-12-03 06:59:23

操作符驗證點屬性

2010-03-05 10:04:38

Python運算符

2019-09-02 09:48:39

Redis數(shù)據(jù)結(jié)構(gòu)對象

2021-06-09 07:01:30

前端CallApply

2009-07-21 09:31:00

Scala基本類型文本

2021-07-14 07:00:53

瀏覽器技巧前端

2021-08-04 06:56:49

HTTP緩存前端

2021-10-18 09:01:01

前端賦值淺拷貝

2010-04-23 15:07:07

Oracle數(shù)字

2021-05-12 07:04:55

Js變量方式

2021-11-19 09:01:09

防抖節(jié)流前端

2021-06-04 07:04:29

閉包JavaScript函數(shù)

2021-07-26 05:01:55

瀏覽器渲染流程
點贊
收藏

51CTO技術(shù)棧公眾號