溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何實現(xiàn)JS中‘hello’與new String(‘hello’)引出的問題

發(fā)布時間:2021-07-21 10:58:37 來源:億速云 閱讀:117 作者:小新 欄目:web開發(fā)

小編給大家分享一下如何實現(xiàn)JS中‘hello’與new String(‘hello’)引出的問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

定義一個字符串

在工作中我們大概有3種方法去定義一個字符串:

1. var str = 'hello';
2. var str1 = String('hello');
3. var str2 = new String('hello');

(下文直接會帶 以上三個變量....)

這三種方法定義出來的 'hello',都有自己的屬性 例如lengh,有自己的方法例如: indexOf(),在日常工作定義中也沒有感覺到任何的不同。

那是否深入過,

1.這三種方式定義出來的'hello',是否是一樣的呢?

2.為什么基本類型可以直接調(diào)用其對應(yīng)的方法呢?

這三種方式定義出來的'hello',是否是一樣的呢?

console.log(str === str1) //true
console.log(str === str2) //false
console.log(str1 === str2) //false

我們可以發(fā)現(xiàn) 最后一種方式定義的 與上面兩種方式定義的 不相等。

???

首先我們知道一個東西 就是:

new 出來的一定是對象。

所以分別 打出三個的類型:

console.log(typeof str) //string
console.log(typeof str1) // string
console.log(typeof str2) //object

所以這也就是為什么不會嚴(yán)格相等的原因。

引出數(shù)據(jù)類型 與 堆棧之間的關(guān)系

嘗試深入理解原因:

我們知道,String,Number,Boolean在JS中是基本類型,基本類型是存儲在棧(stack)內(nèi)存中的,數(shù)據(jù)大小確定,內(nèi)存空間大小可以分配。

而引用類型是存儲在堆(heap)內(nèi)存中的,例如對象, 棧中存在的僅僅是一個堆的指針,這也就是我們?nèi)粘S龅?a = {num:1}, b=a, b.num1 = 2, 那么a.num1 也為2 的原因。因為a,b同時指向同一個地址。

前兩種方式定義出來的是在棧中并且值相等,而第三種方法定義出來的僅僅是棧中的一個指針。

所以這也是為什么 三種方式定義出來的不一樣。

為什么基本類型可以直接調(diào)用其對應(yīng)的方法呢?

嘗試:

console.log(str.length) // 5
str.say = 'world'
console.log(str.say) //undefined

 console.log(str1.lengh) // 5
str1.say = 'world'
console.log(str1.say) //undefined

console.log(str2.lengh) // 5
str2.say = 'world'
console.log(str.say) //world

引出包裝對象和原始資料類型

我們發(fā)現(xiàn)第一種第二種方式均可訪問lengh屬性,

但是為什么我們并不能自定義一個屬性并進(jìn)行訪問?

數(shù)字、字符串、布爾三者,在JS中稱為原始的(primitives)資料類型,而 new String(), new Number() 就是包裝對象。

包裝對象也是對象。

這也就是為什么 我們打印 三種類型分別為 : string(原始資料類型) , string(原始資料類型) , object(包裝對象).

我們可以理解 new 出來的 str2 對象有 String 的一系列方法

console.log(str2.indexOf === String.prototype.indexOf) // true

那嘗試一下 第一種第二種方法 是否有同樣的true?

console.log(str.indexOf === String.prototype.indexOf) //true
console.log(str1.indexOf === String.prototype.indexOf) //true

但是:

str instanceof String // false
str1 instanceof String // false

str 又 不屬于String 卻擁有 String 的方法?????

因為:

這是JS中的設(shè)計。

這是JS中的設(shè)計。

這是JS中的設(shè)計。

原始資料類型的方法與屬性是"借"來的

一個原始的資料類型值,并沒有如對象會有屬性或方法,

原始的資料類型在運算時用的屬性與方法,是向包裝對象"借來"的用的,

所以原始資料類型是可以向 new String() 或者 new Number() 借來所有的方法。但是自己本身卻沒有屬性和方法。

所以這也就是為什么第一種第二種我們無法去自定義屬性卻可以使用對應(yīng)類型的方法的原因

以上是“如何實現(xiàn)JS中‘hello’與new String(‘hello’)引出的問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

js
AI