關(guān)于網(wǎng)站運(yùn)營(yíng)的問(wèn)題百度賬號(hào)免費(fèi)注冊(cè)
Javascript的數(shù)據(jù)類型
- 1.基本數(shù)據(jù)類型
- 1.1七種基本數(shù)據(jù)類型
- 1.2單獨(dú)說(shuō)說(shuō)BigInt?
- 1.3其它注意點(diǎn)
- 2.引用數(shù)據(jù)類型
- 3.基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的區(qū)別
- 4.雙等于號(hào)和三等于號(hào)的區(qū)別
- 5.Javascript的類型轉(zhuǎn)換機(jī)制
- 5.1顯示轉(zhuǎn)換(強(qiáng)制轉(zhuǎn)換)
- 5.2隱式轉(zhuǎn)換
- (1)減、乘、除
- (2)加(加法要區(qū)別算,因?yàn)?#43;不僅僅是加法,還可以拼接)
- (3)單個(gè)變量
- (4)ToPrimitive原則
?JavaScript主要有兩種類型:基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型?(引用數(shù)據(jù)類型)。
1.基本數(shù)據(jù)類型
1.1七種基本數(shù)據(jù)類型
- Boolean?:表示邏輯值,只有兩個(gè)值:true 和 false。
- Number?:表示數(shù)值,可以是整數(shù)或浮點(diǎn)數(shù)。?
- String?:表示文本數(shù)據(jù),用引號(hào)括起來(lái)。
- ?Undefined?:表示未定義的值。?
- Null?:表示空值,通常用于表示對(duì)象不存在或沒(méi)有初始化。?
- Symbol?(ES6 引入):一種唯一的、不可變的數(shù)據(jù)類型,通常用于作為對(duì)象屬性的標(biāo)識(shí)符。?
- BigInt?(ES6 引入):表示大整數(shù),用于處理超出普通數(shù)字范圍的值。
1.2單獨(dú)說(shuō)說(shuō)BigInt?
在 JavaScript 中,最大的安全整數(shù)是 2 的 53 次方減 1,即 Number.MAX_SAFE_INTEGER,其值為 9007199254740991。這是因?yàn)?JavaScript 中使用雙精度浮點(diǎn)數(shù)表示數(shù)字,雙精度浮點(diǎn)數(shù)的符號(hào)位占 1 位,指數(shù)位占 11 位,尾數(shù)位占 52 位,因此能夠準(zhǔn)確表示的整數(shù)范圍是有限的。超過(guò)這個(gè)范圍的整數(shù)可能會(huì)失去精度。
//超過(guò)了2**53-1后精度會(huì)缺失
console.log(2 ** 53 - 1); //9007199254740991
console.log(Number.MAX_SAFE_INTEGER); //9007199254740991
console.log(2 ** 53); //9007199254740992
console.log(2 ** 53 + 1); //9007199254740992
console.log(2 ** 53 + 2); //9007199254740994
console.log(2 ** 53 + 3); //9007199254740996
console.log(2 ** 53 + 4); //9007199254740996
BigInt 是 JavaScript 中引入的一種新的數(shù)據(jù)類型,用于表示任意精度的整數(shù)。與普通的數(shù)字類型不同,BigInt 可以表示超出 Number.MAX_SAFE_INTEGER 的整數(shù)值,因此它可以用于處理非常大的整數(shù),而不會(huì)丟失精度。
要?jiǎng)?chuàng)建 BigInt,可以在整數(shù)值后面添加 n 或調(diào)用 BigInt() 函數(shù)并將整數(shù)作為參數(shù)傳遞。
console.log(5648941287894651132156549781132n);
console.log(BigInt("5648941287894651132156549781132"));
Biglnt不能和普通的數(shù)字進(jìn)行混合運(yùn)算,只能使用Biglnt類型進(jìn)行運(yùn)算。
console.log(10000n + 10000n); //20000n
console.log(45612316546871512315645487n * 312121100n); //14236566414157737982622816612475700n
console.log(45612316546871512315645487 * 312121100n);//報(bào)錯(cuò)
比較運(yùn)算符:
console.log(20n > 15); //true
console.log(20n === 20); //===不會(huì)做強(qiáng)制類型轉(zhuǎn)換,false
console.log(typeof 20n); //類型為bigint
console.log(20n == "20"); //==不會(huì)嚴(yán)格比較,true
1.3其它注意點(diǎn)
console.log(typeof NaN); //number
console.log(typeof null); //object
console.log(undefined == null); //true
console.log(undefined === null); //false
2.引用數(shù)據(jù)類型
- Object
- Array
- Function
- RegExp
- Date
- Map
- Set
3.基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的區(qū)別
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型本質(zhì)的不同是存儲(chǔ)上的區(qū)別。
基本數(shù)據(jù)類型的值直接存儲(chǔ)在棧內(nèi)存中,值與值之間獨(dú)立存在,修改一個(gè)變量不會(huì)影響到其他變量。對(duì)象(引用數(shù)據(jù)類型)是保存在堆內(nèi)存中的,每創(chuàng)建一個(gè)新對(duì)象,就會(huì)在堆內(nèi)存中開(kāi)辟出一個(gè)新空間,變量保存的是對(duì)象的內(nèi)存地址(對(duì)象的引用)。如果兩個(gè)變量保存的是同一個(gè)對(duì)象引用,當(dāng)其中一個(gè)通過(guò)變量修改屬性時(shí),另一個(gè)也會(huì)受到影響?。(很多地方都碰到過(guò)這種情況)
4.雙等于號(hào)和三等于號(hào)的區(qū)別
=== 判斷兩邊數(shù)據(jù)是否全等
,即數(shù)據(jù)類型與值
均相等。而 == 只判斷值
是否相等。
5.Javascript的類型轉(zhuǎn)換機(jī)制
5.1顯示轉(zhuǎn)換(強(qiáng)制轉(zhuǎn)換)
- Number()
- parseInt()
- Boolean()
- String()
5.2隱式轉(zhuǎn)換
當(dāng)運(yùn)算符兩端的數(shù)據(jù)類型不一致,會(huì)觸發(fā)隱式轉(zhuǎn)換。
(1)減、乘、除
在對(duì)非Number
類型運(yùn)用數(shù)學(xué)運(yùn)算符(-
、*
或 /
)時(shí),會(huì)先將非 Number
類型轉(zhuǎn)換為 Number
類型再進(jìn)行計(jì)算。示例如下:
console.log('a'-'b')//NaN
console.log(3-true)//2
console.log(3-null)//3
console.log(3-undefined)//NaN
console.log(false-null)//0
console.log(function (){}-0)//NaN
注意:在算術(shù)運(yùn)算中,如果操作數(shù)中有 undefined
,其運(yùn)算結(jié)果是就是 NaN
;null
在算術(shù)運(yùn)算中則是隱式轉(zhuǎn)換為數(shù)值 0
來(lái)參與運(yùn)算。
(2)加(加法要區(qū)別算,因?yàn)?#43;不僅僅是加法,還可以拼接)
加法運(yùn)算遵守以下 3 條規(guī)則,優(yōu)先級(jí)從高到低
- 當(dāng)一側(cè)為
String
類型,被識(shí)別為字符串拼接,并會(huì)優(yōu)先將另一側(cè)轉(zhuǎn)換為字符串類型。 - 當(dāng)一側(cè)為
Number
類型,另一側(cè)為原始類型,則將原始類型轉(zhuǎn)換為Number
類型。 - 當(dāng)一側(cè)為
Number
類型,另一側(cè)為引用類型,將引用類型和Number
類型轉(zhuǎn)換成字符串后拼接。
(3)單個(gè)變量
如果只有單個(gè)變量,會(huì)先將變量轉(zhuǎn)換為 Boolean
值。只有 null
、undefined
、''
、NaN
、0
、 false
這幾個(gè)會(huì)被轉(zhuǎn)換為 false
,其他的情況都是 true
,比如 {}
, []
等。
(4)ToPrimitive原則
ToPrimitive
規(guī)則會(huì)嘗試調(diào)用對(duì)象的 valueOf
和 toString
方法,將參數(shù)轉(zhuǎn)換為原始類型。
當(dāng)對(duì)象類型需要轉(zhuǎn)為原始類型時(shí),它會(huì)先查找對(duì)象的 valueOf
方法,如果 valueOf
方法返回原始類型的值,則 ToPrimitive
的結(jié)果就是這個(gè)值,如果 valueOf
不存在或者 valueOf
方法返回的不是原始類型的值,就會(huì)嘗試調(diào)用對(duì)象的 toString
方法,也就是會(huì)遵循對(duì)象的 ToString
規(guī)則,然后使用toString
的返回值作為 ToPrimitive
的結(jié)果。
let str = new String(1) // 通過(guò) new String 創(chuàng)建了一個(gè)對(duì)象console.log(typeof str) // objectconsole.log(str.valueOf()) // "1"console.log(typeof str.valueOf()) // stringconst obj = {valueOf() {return 1},toString() {return 2}}console.log(Number(obj)) // 1
注意:如果 valueOf
和 toString
都沒(méi)有返回原始類型的值,則會(huì)拋出異常。
const obj = {valueOf() {return []},toString() {return {}}
}
console.log(Number(obj)) // TypeError: Cannot convert object to primitive value
特殊:
String({}) // [object Object]
Number([]) // 0
String({})
空對(duì)象會(huì)先調(diào)用 valueOf
,但返回的是對(duì)象本身 {}
,不是原始類型,所以會(huì)繼續(xù)調(diào)用toString
,得到 [object Object]
,String([object Object])
,所以轉(zhuǎn)換后的結(jié)果為 [object Object]
。
Number([])
空數(shù)組會(huì)先調(diào)用 valueOf
,但返回的是數(shù)組本身 []
,不是原始類型,所以會(huì)繼續(xù)調(diào)用toString
,得到 ''
,相當(dāng)于 Number('')
,所以轉(zhuǎn)換后的結(jié)果為 0
。