定義一個字符串
在工作中我們大概有3種方法去定義一個字符串:
1. var str = 'hello';
2. var str1 = String('hello');
3. var str2 = new String('hello');
(下文直接會帶 以上三個變量....)
這三種方法定義出來的 'hello',都有自己的屬性 例如lengh,有自己的方法例如: indexOf(),在日常工作定義中也沒有感覺到任何的不同。
那是否深入過,
1.這三種方式定義出來的'hello',是否是一樣的呢?
2.為什么基本類型可以直接調用其對應的方法呢?
這三種方式定義出來的'hello',是否是一樣的呢?
console.log(str === str1) //trueconsole.log(str === str2) //falseconsole.log(str1 === str2) //false
我們可以發現 最后一種方式定義的 與上面兩種方式定義的 不相等。
???
首先我們知道一個東西 就是:
new 出來的一定是對象。
所以分別 打出三個的類型:
console.log(typeof str) //stringconsole.log(typeof str1) // stringconsole.log(typeof str2) //object
所以這也就是為什么不會嚴格相等的原因。
引出數據類型 與 堆棧之間的關系
嘗試深入理解原因:
我們知道,String,Number,Boolean在JS中是基本類型,基本類型是存儲在棧(stack)內存中的,數據大小確定,內存空間大小可以分配。
而引用類型是存儲在堆(heap)內存中的,例如對象, 棧中存在的僅僅是一個堆的指針,這也就是我們日常遇到 a = {num:1}, b=a, b.num1 = 2, 那么a.num1 也為2 的原因。因為a,b同時指向同一個地址。
前兩種方式定義出來的是在棧中并且值相等,而第三種方法定義出來的僅僅是棧中的一個指針。
所以這也是為什么 三種方式定義出來的不一樣。
為什么基本類型可以直接調用其對應的方法呢?
嘗試:
console.log(str.length) // 5str.say = 'world'console.log(str.say) //undefined console.log(str1.lengh) // 5str1.say = 'world'console.log(str1.say) //undefinedconsole.log(str2.lengh) // 5str2.say = 'world'console.log(str.say) //world
引出包裝對象和原始資料類型
我們發現第一種第二種方式均可訪問lengh屬性,
但是為什么我們并不能自定義一個屬性并進行訪問?
數字、字符串、布爾三者,在JS中稱為原始的(primitives)資料類型,而 new String(), new Number() 就是包裝對象。
包裝對象也是對象。
這也就是為什么 我們打印 三種類型分別為 : string(原始資料類型) , string(原始資料類型) , object(包裝對象).
我們可以理解 new 出來的 str2 對象有 String 的一系列方法
新聞熱點
疑難解答
圖片精選