
內(nèi)置類型
js 中內(nèi)置類型一共 7 種(包括 es6),7 種內(nèi)置類型可分為兩大類型:基本類型 和 引用類型(對(duì)象Object)。
1.基本類型包括:null、undefined、string、number、boolean、symbol。
重點(diǎn)說(shuō)下數(shù)字類型number:
- js 中數(shù)字類型是浮點(diǎn)類型的,沒(méi)有 整型。浮點(diǎn)類型基于 IEEE 754 標(biāo)準(zhǔn)實(shí)現(xiàn),在使用中會(huì)有 bug;
-
NaN也屬于number類型,并且NaN不等于自身;
2.對(duì)象(Object)是引用類型,在使用過(guò)程中會(huì)遇到 淺拷貝 和 深拷貝 的問(wèn)題。
const x = { name: 'x'};
const y = x;
y.name = 'y';
console.log(x.name); // y
typeof 應(yīng)用
1.對(duì)于基本類型,除了 null 都可以顯示正確類型
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,明明是基本類型,可是就顯示 object
typeof null ; // 'object'
那為什么會(huì)出現(xiàn)這種情況呢?
js 最初版本中,使用的是 32 位系統(tǒng),為了性能考慮使用低位存儲(chǔ)變量的類型信息,000 開(kāi)頭表示對(duì)象,而 null 表示全零,所以將它錯(cuò)判為 object 了。雖然現(xiàn)在內(nèi)部類型的判斷代碼變了,但是這個(gè) bug 卻一直流傳下來(lái)。
4.正確獲取變量類型可使用 Object.prototype.toString.call(xx),獲得類似 [object Type] 的字符串
Object.prototype.toString.call(111)
類型轉(zhuǎn)換
1.轉(zhuǎn)Bollean
除了 undefined、null、false、NaN、''、0、-0,其他都為 true,包括對(duì)象。
2.對(duì)象轉(zhuǎn)基本類型
對(duì)象轉(zhuǎn)基本類型時(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í),一方是字符串類型,就會(huì)把另一方也轉(zhuǎn)為字符串類型;
- 其他運(yùn)算只要其中一方是數(shù)字,那么另一方就轉(zhuǎn)為數(shù)字;
- 加法運(yùn)算符會(huì)觸發(fā)3鐘類型轉(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)基本類型
有個(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)比較;