前端百題—— js中的包裝對象

1 背景

有一個奇怪的現象不知道你們注意過沒有,字符串、數字、布爾值都可以調用屬性和方法,例如:javascript

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
複製代碼

看到這個現象,你們是否是感受很奇怪,這與咱們平時的想法是相悖的,畢竟咱們認爲基本類型上面是不存在屬性和方法的,這個時候主角包裝對象就出現了。html

2 包裝對象

JS 的數值,布爾,字符串類型的變量,在必定條件下,也能夠自動變成對象,這就是原始類型的包裝對象。包裝對象實際上是一種特殊的引用類型,其與引用類型的主要區別在於生命週期。java

  1. 通常的引用類型在使用new建立其實例時,在執行流離開當前做用域以前一直都保存在內存中;
  2. 包裝類型的對象只存在該行代碼的執行瞬間,而後會當即被銷燬。(也意味着在運行時不能爲基本類型添加屬性和方法)

3 包裝對象後臺執行流程

基本類型中的String、Number、Boolean在調用屬性和方法的時候,後臺是怎樣執行的呢?其實整個過程能夠簡化爲三步:git

  1. 建立一個對象類型的實例,例如字符串則建立一個String類型的實例;
  2. 調用該實例對象上的特定方法;
  3. 銷燬該實例。

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

const str = 'abc';
const strNew = str.substring(0, 2);
複製代碼

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

let strObj = new String(str);
const strNew = strObj.substring(0, 2);
strObj = null;
複製代碼

4 擴展

  1. 包裝對象和一樣的原始類型的值相等嗎?

不相等。由於包裝對象是引用類型,原始類型是基本類型;包裝對象的最大目的,首先是使得 JavaScript 的對象涵蓋全部的值,其次使得原始類型的值能夠方便地調用某些方法。url

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

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

  1. 同一個字符串調用兩次相同的方法其包裝對象相等嗎?

不相等。調用結束後,包裝對象實例會自動銷燬。這意味着,下一次調用字符串的屬性時,實際是調用一個新生成的對象,而不是上一次調用時生成的那個對象,這也說明了爲何不能直接給字符串、數字、布爾值添加屬性和方法。.net

1.若是以爲這篇文章還不錯,來個分享、點贊吧,讓更多的人也看到code

若是你以爲這篇文章對你有點用的話,麻煩請給咱們的開源項目點點star:   http://github.crmeb.net/u/defu                   不勝感激 !
來自 「開源世界 」 ,連接: https://ym.baisou.ltd/post/739.html ,如需轉載,請註明出處,不然將追究法律責任。 ​​​​​​
 
相關文章
相關標籤/搜索