国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JS中‘hello’與new String(‘hello’)引出的問題詳解

2024-05-06 15:31:40
字體:
來源:轉載
供稿:網友

定義一個字符串

在工作中我們大概有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 的一系列方法

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 长垣县| 台山市| 伊宁市| 望谟县| 宜昌市| 云林县| 张家界市| 盘山县| 航空| 德钦县| 平顺县| 武夷山市| 泉州市| 堆龙德庆县| 高要市| 齐河县| 连平县| 临邑县| 藁城市| 筠连县| 乌拉特后旗| 彰化市| 绥阳县| 泉州市| 东安县| 同仁县| 麦盖提县| 滁州市| 沈阳市| 北辰区| 锡林郭勒盟| 阜阳市| 尼勒克县| 洪泽县| 荃湾区| 石屏县| 饶阳县| 宿州市| 舟山市| 巧家县| 拉孜县|