內(nèi)置類(lèi)型
js 中內(nèi)置類(lèi)型一共 7 種(包括 es6)揩局,7 種內(nèi)置類(lèi)型可分為兩大類(lèi)型:基本類(lèi)型 和 引用類(lèi)型(對(duì)象Object)。
1.基本類(lèi)型包括:null
大溜、undefined
侦讨、string
、number
翠语、boolean
、symbol
财边。
重點(diǎn)說(shuō)下數(shù)字類(lèi)型number
:
- js 中數(shù)字類(lèi)型是浮點(diǎn)類(lèi)型的肌括,沒(méi)有 整型。浮點(diǎn)類(lèi)型基于 IEEE 754 標(biāo)準(zhǔn)實(shí)現(xiàn)酣难,在使用中會(huì)有 bug谍夭;
-
NaN
也屬于number
類(lèi)型,并且NaN
不等于自身鲸鹦;
2.對(duì)象(Object)是引用類(lèi)型慧库,在使用過(guò)程中會(huì)遇到 淺拷貝 和 深拷貝 的問(wèn)題。
const x = { name: 'x'};
const y = x;
y.name = 'y';
console.log(x.name); // y
typeof 應(yīng)用
1.對(duì)于基本類(lèi)型馋嗜,除了 null
都可以顯示正確類(lèi)型
typeof x; // 'undefined'
typeof '1'; // 'string'
typeof 1; // 'number'
typeof true; // 'boolean'
typeof Symbol(); // 'symbol'
typeof 1
也可以寫(xiě)成 typeof(1)
齐板,其他也是一樣。
2.對(duì)于對(duì)象葛菇,除了函數(shù)都顯示object
typeof []; // 'object'
typeof {}; // 'object'
typeof console; // 'object'
typeof console.log; // 'function'
3.說(shuō)說(shuō) null
甘磨,一個(gè)遺留 bug,明明是基本類(lèi)型眯停,可是就顯示 object
typeof null ; // 'object'
那為什么會(huì)出現(xiàn)這種情況呢济舆?
js 最初版本中,使用的是 32 位系統(tǒng)莺债,為了性能考慮使用低位存儲(chǔ)變量的類(lèi)型信息滋觉,000
開(kāi)頭表示對(duì)象,而 null
表示全零齐邦,所以將它錯(cuò)判為 object
了椎侠。雖然現(xiàn)在內(nèi)部類(lèi)型的判斷代碼變了,但是這個(gè) bug 卻一直流傳下來(lái)措拇。
4.正確獲取變量類(lèi)型可使用 Object.prototype.toString.call(xx)
我纪,獲得類(lèi)似 [object Type]
的字符串
Object.prototype.toString.call(111)
類(lèi)型轉(zhuǎn)換
1.轉(zhuǎn)Bollean
除了 undefined
、null
丐吓、false
浅悉、NaN
、''
券犁、0
术健、-0
,其他都為 true
粘衬,包括對(duì)象苛坚。
2.對(duì)象轉(zhuǎn)基本類(lèi)型
對(duì)象轉(zhuǎn)基本類(lèi)型時(shí)比被,會(huì)調(diào)用 valueOf
、toString
兩個(gè)方法泼舱,也可以重寫(xiě) Symbol.toPrimitive
(優(yōu)先級(jí)最高)
let p = {
valueOf(){
return 0;
},
toString(){
return '1';
},
[Symbol.toPrimitive] (){
return 2;
}
}
console.log(1 + p); // 3
console.log('1' + p); // 12
3.四則運(yùn)算符
- 只有加法運(yùn)算符時(shí)等缀,一方是字符串類(lèi)型,就會(huì)把另一方也轉(zhuǎn)為字符串類(lèi)型;
- 其他運(yùn)算只要其中一方是數(shù)字娇昙,那么另一方就轉(zhuǎn)為數(shù)字;
- 加法運(yùn)算符會(huì)觸發(fā)3鐘類(lèi)型轉(zhuǎn)換:將值轉(zhuǎn)換為原始值尺迂,轉(zhuǎn)換為數(shù)字,轉(zhuǎn)換為字符串冒掌。
console.log(1 + '1'); // 11
console.log(1 * '1'); // 1
console.log([1, 2] + [1, 2]); // '1, 21, 2'
// [1, 2].toString() => '1, 2'
// [1, 2].toString() => '1, 2'
// '1, 2' + '1, 2' => '1, 21, 2'
加號(hào)有個(gè)需要主要的表達(dá)式 'a' + + 'b'
console.log('a' + + 'b'); // aNaN
// + 'b' => NaN
4.==
操作符
比較運(yùn)算 x == y
噪裕,其中 x
和 y
是值,產(chǎn)生 true
或 false
:
(1).Type(x)
與 Type(y)
相同股毫,則
-
Type(x)
為undefined
膳音,返回true
; -
Type(x)
為null
,返回true
; -
Type(x)
為number
铃诬,則-
x
為NaN
祭陷,返回false
(NaN == NaN
); -
y
為NaN
,返回false
(NaN == NaN
); -
x
與y
相等數(shù)值趣席,返回true
; -
x
為+0
兵志,y
為-0
,返回true
; -
x
為-0
宣肚,y
為+0
想罕,返回true
;
-
-
Type(x)
為string
,則當(dāng)x
與y
為完全相同的字符序列(長(zhǎng)度相等且相同字符在相同位置)時(shí)返回true
霉涨,否則false
('11' == '21')按价。 -
Type(x)
為boolean
,x
與y
同為true
或同為false
笙瑟,返回true;
(2).x
為 null
且 y
為 undefined
楼镐,返回 true
,互換也是;
(3).若 Type(x)
為 number
且 Type(y)
為 string
逮走,返回 comparison x = toNumber(y)
的結(jié)果鸠蚪,互換也是今阳;
(4).Type(x)
為 boolean
师溅,返回 toNumber(x)
= y
( 5 > 3 == 1),互換也是;
(5).Type(x)
為 string
或 number
,且 Type(y)
為 object
盾舌,返回 x = toPrimitive(y)
的結(jié)果墓臭,互換也是;
注:toPrimitive
對(duì)象轉(zhuǎn)基本類(lèi)型
有個(gè)燒腦的例子:
console.log( [] == ![] ); // true
// 從右往左解析妖谴, [] => true => 取反 => false => [] = false
// 根據(jù)第(4)條窿锉,toNumber(false) => 0
// 根據(jù)第(5)條酌摇,toPrimitive([]) == 0 => [].toString() => ''
// 根據(jù)第(3)條,toNumber('') == 0 => 0 == 0
總結(jié):對(duì)象-布爾(字符串)-數(shù)字
5.運(yùn)算符
- 如果是對(duì)象嗡载,通過(guò)
toPrimitive
轉(zhuǎn)為對(duì)象窑多; - 如果是字符串,通過(guò)
unicode
字符索引來(lái)比較洼滚;