JavaScript中的包裝類型詳解
- 在 JavaScript 中,我們有基本類型和對(duì)象類型兩種數(shù)據(jù)類型电媳。
- 基本類型包括
String
,Number
匾乓,Boolean
,null
拼缝,undefined
和Symbol
。然而彰亥,當(dāng)我們需要在這些基本類型上調(diào)用方法時(shí),就需要用到 JavaScript 的包裝類型任斋。
什么是包裝類型?
包裝類型是 JavaScript 中的一種特殊對(duì)象仁卷,它們將基本類型的值“包裝”在對(duì)象中,使我們能夠在基本類型上調(diào)用方法锦积。JavaScript 提供了三種包裝類型:
String
歉嗓,Number
和Boolean
丰介。例如,當(dāng)我們?cè)谝粋€(gè)字符串上調(diào)用方法時(shí)哮幢,JavaScript 會(huì)臨時(shí)將其轉(zhuǎn)換(或者說“包裝”)為一個(gè)對(duì)象,這樣就可以調(diào)用方法了橙垢。
var str = 'hello';
console.log(str.toUpperCase()); // 輸出 "HELLO"
- 在這個(gè)例子中,
str
是一個(gè)字符串基本類型柜某,但我們可以在它上面調(diào)用toUpperCase
方法。這是因?yàn)?JavaScript 在后臺(tái)臨時(shí)將str
包裝成了一個(gè)String
對(duì)象喂击,然后在這個(gè)對(duì)象上調(diào)用了toUpperCase
方法。
包裝類型的特性
值得注意的是翰绊,這種包裝只是臨時(shí)的,調(diào)用方法后监嗜,基本類型值會(huì)恢復(fù)到原來的狀態(tài)谐檀。這就是所謂的包裝類型裁奇。
此外,雖然
null
和undefined
也是基本類型框喳,但它們沒有對(duì)應(yīng)的包裝類型,也沒有可以調(diào)用的方法五垮。
包裝類型的注意事項(xiàng)
- 雖然包裝類型在 JavaScript 中非常有用乍惊,但在使用時(shí)也需要注意一些問題放仗。例如,雖然
Boolean
對(duì)象是一個(gè)包裝類型诞挨,但它在布爾上下文中總是被視為true
莉撇,無論它包裝的值是true
還是false
惶傻。這可能會(huì)導(dǎo)致一些意想不到的結(jié)果。
var bool = new Boolean(false);
if (bool) {
console.log('run?'); // 會(huì)進(jìn)到 if 條件里面嗎银室?
}
在這個(gè)例子中励翼,
bool
是一個(gè)Boolean
對(duì)象,其包裝的值為false
辜荠。然而,因?yàn)?bool
是一個(gè)對(duì)象伯病,所以在if
語句中,它被視為true
午笛,所以console.log
語句總是會(huì)執(zhí)行。所以打印出run?
季研。總的來說,包裝類型是 JavaScript 中一個(gè)重要的概念与涡,它讓我們能夠在基本類型上調(diào)用方法,極大地增強(qiáng)了 JavaScript 的靈活性和功能性驼卖。然而,在使用時(shí)酌畜,我們也需要注意它的一些特性和潛在問題怎囚。
面試題
- 有可能會(huì)是面試題桥胞,先看以下代碼:
var a = new Boolean(false);
if (!a) {
console.log('run?'); // 會(huì)進(jìn)到 if 條件里面嗎?
}
- 看了上面關(guān)于包裝類型的介紹贩虾,那會(huì)執(zhí)行到 if 里面嗎?
- 不會(huì)
- 為什么呢缎罢?
// 個(gè)人的解析過程:
1. var a = new Boolean(false); 之后伊群,a 的值為 [Boolean: false]
2. 將 a 轉(zhuǎn)換為包裝類型策精,執(zhí)行 Object(a) 后值為 [Boolean: false]
3. 因?yàn)樵?if 語句中的判斷條件都會(huì)轉(zhuǎn)換為 boolean 再進(jìn)行判斷,那再進(jìn)行 boolean 值的轉(zhuǎn)換, !!Object(a) 后值為 true
4. 而在 if 語句中的條件是取反 a咽袜,則 if 條件不成立,則 if 中的語句不執(zhí)行
- 原因:
- 在 JavaScript 中询刹,有兩種類型的布爾值:基本類型的布爾值
(true 或 false)
和Boolean
對(duì)象(通過new Boolean()
創(chuàng)建的抽莱,它是一個(gè)包裝對(duì)象范抓,可以包裝一個(gè)布爾值,但它本身是一個(gè)對(duì)象)匕垫。 - 在 JavaScript 中,所有的對(duì)象(包括
Boolean
對(duì)象)在布爾上下文中都被視為true
象泵,無論它們包裝的值是true
還是false
寞秃。 - 這就是為什么 if 語句中的
!a
不會(huì)執(zhí)行的原因偶惠,因?yàn)?a
是一個(gè)Boolean
對(duì)象,即使它包裝的值是false
忽孽,在布爾上下文中也被視為true
,所以!a
的結(jié)果是false
兄一。