js 中內置類型一共 7 種(包括 es6),7 種內置類型可分爲兩大類型:基本類型 和 引用類型(對象Object)。javascript
1.基本類型包括:null
、undefined
、string
、number
、boolean
、symbol
。java
重點說下數字類型number
:es6
NaN
也屬於 number
類型,而且 NaN
不等於自身;2.對象(Object)是引用類型,在使用過程當中會遇到 淺拷貝 和 深拷貝 的問題。函數
const x = { name: 'x'};
const y = x;
y.name = 'y';
console.log(x.name); // y
複製代碼
1.對於基本類型,除了 null
均可以顯示正確類型post
typeof x; // 'undefined'
typeof '1'; // 'string'
typeof 1; // 'number'
typeof true; // 'boolean'
typeof Symbol(); // 'symbol'
複製代碼
typeof 1
也能夠寫成 typeof(1)
,其餘也是同樣。性能
2.對於對象,除了函數都顯示object
ui
typeof []; // 'object'
typeof {}; // 'object'
typeof console; // 'object'
typeof console.log; // 'function'
複製代碼
3.說說 null
,一個遺留 bug,明明是基本類型,但是就顯示 object
spa
typeof null ; // 'object'
複製代碼
那爲何會出現這種狀況呢? js 最第一版本中,使用的是 32 位系統,爲了性能考慮使用低位存儲變量的類型信息,000
開頭表示對象,而 null
表示全零,因此將它錯判爲 object
了。雖然如今內部類型的判斷代碼變了,可是這個 bug 卻一直流傳下來。prototype
4.正確獲取變量類型可以使用 Object.prototype.toString.call(xx)
,得到相似 [object Type]
的字符串code
Object.prototype.toString.call(111)
複製代碼
除了 undefined
、null
、false
、NaN
、''
、0
、-0
,其餘都爲 true
,包括對象。
對象轉基本類型時,會調用 valueOf
、toString
兩個方法,也能夠重寫 Symbol.toPrimitive
(優先級最高)
let p = {
valueOf(){
return 0;
},
toString(){
return '1';
},
[Symbol.toPrimitive] (){
return 2;
}
}
console.log(1 + p); // 3
console.log('1' + p); // 12
複製代碼
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'
複製代碼
加號有個須要主要的表達式 'a' + + 'b'
console.log('a' + + 'b'); // aNaN
// + 'b' => NaN
複製代碼
==
操做符比較運算 x == y
,其中 x
和 y
是值,產生 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
相等數值,返回 true
;x
爲 +0
,y
爲 -0
,返回 true
;x
爲 -0
,y
爲 +0
,返回 true
;Type(x)
爲 string
,則當 x
與 y
爲徹底相同的字符序列(長度相等且相同字符在相同位置)時返回 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)
的結果,互換也是;
(4).Type(x)
爲 boolean
,返回 toNumber(x)
= y
( 5 > 3 == 1),互換也是;
(5).Type(x)
爲 string
或 number
,且 Type(y)
爲 object
,返回 x = toPrimitive(y)
的結果,互換也是;
注:toPrimitive
對象轉基本類型
有個燒腦的例子:
console.log( [] == ![] ); // true
// 從右往左解析, [] => true => 取反 => false => [] = false
// 根據第(4)條,toNumber(false) => 0
// 根據第(5)條,toPrimitive([]) == 0 => [].toString() => ''
// 根據第(3)條,toNumber('') == 0 => 0 == 0
複製代碼
總結:對象-布爾(字符串)-數字
toPrimitive
轉爲對象;unicode
字符索引來比較;