你不知道的typeof string 居然等於object

寫在開頭

  • 越是高級的崗位,從事越底層的工做,就越須要你對基礎知識紮實,我之後不會再跟之前同樣搞那麼十幾個的手寫源碼教程了,會更專一基礎
  • 明天是1024,我會在公衆號送出【100個現金紅包】,不關注也能夠參與抽獎,你們記得參與就好。(並不是爲了宣傳公衆號,就簡單發個福利,讓你們高興熱鬧下,很多號主也常常抽到個人禮品)
  • 今天研究的是字符串

正式開始

  • 爲何要研究字符串前端

    • 由於JS有一個特殊點:typeof null結果是object
  • 還有一個緣由是:字符串居然有方法,可是它又不能夠設置屬性。讓咱們用代碼揭曉
const str = '前端巔峯Peter老師牛逼'
    str.xxoo = '你關注了嗎?'
    console.log(str.xxoo, 'xxoo')
  • 結果輸出:undefined
  • 爲何?spa

    • 由於字符串是基礎數據類型,具體答案看後面。

但是字符串爲何又有方法?

  • 用代碼說話:
const str = '前端巔峯Peter老師牛逼'
    console.log(str.substring(1), 'xxoo')
  • 結果輸出:端巔峯Peter老師牛逼
  • 劃重點思考:爲何這個字符串 又有了方法? 明明它只是一個字符串啊!

被遺留的建立建立字符串方法

  • 還有一種建立字符串方法,咱們忘了。
const str = new Object('前端巔峯Peter老師牛逼')
    console.log(typeof str, 'str')
  • 打印結果:obect
  • 經過new Object建立的字符串,居然typeof結果是object,那麼我想,會不會是以某種狀況訪問字符串時,會自動轉換成這樣結果呢?

揭曉答案

  • 咱們建立好了字符串後,經過日常的形式 例如:const str = '特皮牛逼',而後再去調用它的方法時,會有如下幾個步驟:code

    • 聲明字符串:const str = '特皮牛逼'
    • 訪問它的屬性(方法):str.substring(1)
    • 以讀模式訪問str這個字符串,會有接下來幾個步驟對象

      • new String返回一個實例
      • 調用實例上的substring方法
      • 銷燬實例
      • 我以前文章提到過,JS裏面的字符串一旦建立,他們的值就不能改變。要改變某個變量的保存的的字符串,首先要銷燬原來的字符串,而後再用另一個包含新值的字符串填充該變量
      • 因此上面這段代碼,真實的運行應該是:
原始代碼:
const str = 'Peter老師666'
str.substring(1)
真正內部執行的是:
let str = new String('Peter老師666')
let str1 = str.substring(1) 
str = null
重點: JS裏面的字符串一旦建立,他們的值就不能改變。要改變某個變量的保存的的字符串,首先要銷燬原來的字符串,而後再用另一個包含新值的字符串填充該變量

那麼爲何給字符串設置屬性爲何無效呢?

  • 咱們聲明:const str = '前端巔峯'
  • 而後給它設置屬性 str.xxoo = 'xxoo'
  • 而後咱們讀取它的屬性str.xxoo
  • 這期間經歷了什麼:blog

    • str.xxoo = 'xxoo'時,首先會建立一個實例,給這個實例上設置xxoo屬性的值爲:xxoo
    • 當這行代碼執行完了,這個實例就銷燬了
    • 因而當咱們訪問str的時候,並無這個屬性
這就叫原始值包裝類型,它的聲明週期只是這一行訪問它的代碼執行完就銷燬了。這是它與引用類型的區別,咱們經過new String()建立的實例就是一個引用類型,因此它是一個 object.

經過new String建立的實例是一個對象(引用類型)

  • 代碼:
const str = new String('前端巔峯Peter老師牛逼')
    console.log(str, 'str')

  • 因此typeof str獲得的結果是:object

寫在最後

  • 若是有什麼寫得很差的地方,能夠在下面評論指出,平時比較忙,之後會盡可能寫一些基礎、底層被遺忘的知識點,不忘初心,寫文章爲了讓更多人學到他們想要的
  • 若是感受寫得不錯,點個贊/在看/關注吧,公衆號:[前端巔峯]
相關文章
相關標籤/搜索