Brendan Eich在設計JavaScript的時候是沒有加入類型系統的,因此JavaScript是一門動態語言,類型是進入執行上下文的時候可能纔去肯定,這就可能出現一個JavaScript變量在上一瞬間是String,下一瞬間就是Number了,在這個過程當中,JavaScript變量進行了類型的轉換。使用Javascript進行相等運算時,咱們可能會用"==","==="和Object.is來進行比較兩個值是否相等。web
在講到類型轉換以前,咱們把JavaScript的數據類型再進行梳理一遍,最新的 ECMAScript標準定義了 8種原始數據類型,8種原始數據類型又分爲7種基本數據類型和1種引用類型。數組
Undefined、 Null、 String、 Number、 Boolean、Symbol和BigInt這7種數據類型都是屬於基本類型,基本類型都是不可變的,不可變是指基本類型自己和一個賦值爲基本類型的變量的區別。變量會被賦予一個新值,而原值不能像數組、對象以及函數那樣被改變。markdown
類型(x) | 類型(y) | 類型(y) |
---|---|---|
null | undefined | true |
undefined | null | true |
數字 | 字符串 | x == toNumber(y) |
字符串 | 數字 | y== toNumber(x) |
布爾值 | 任何類型 | toNumber(x) == y |
任何類型 | 布爾值 | x == toNumber(y) |
字符串或數字 | 對象 | x == toPrimitive(y) |
對象 | 字符串或數字 | toPrimitive(x)== y |
toNumber對不一樣類型值的轉換規則:函數
toPrimitive對於基本類型不作轉換,輸出等於輸入,對於對象,若是對象的valueOf方法的結果是原始值,則返回原始值,若是對象的toString方法返回的是原始值,則返回這個值,其餘狀況則返回一個錯誤。oop
toNumber和toPrimitive屬於內部的方法ecma對於這兩個方法的描述。url
1 console.log('juejin' ? true : false); // true
2 console.log('juejin' == true); // false
複製代碼
第一行的代碼執行結果是true,第二行代碼的執行結果是false,爲何會出現這樣的結果呢?spa
按照上面的方法,那'juejin' == false是否是會返回true呢?答案仍是false,爲何呢?prototype
null也是基本類型, typeof null === "object",這是JS語言自己的一個bug。不一樣的對象在底層都表示爲二進制,在js中二進制前三位都爲0的話會被判斷爲object類型,null的二進制表示全是0,天然前三位也是0,因此執行typeof時返回"object"。 另外,引用類型裏面的function也能夠使用typeof判斷:設計
其他的引用類型一概返回"object"。3d
instanceof運算符用來檢測constructor.prototype是否存在於某個實例對象的原型鏈上。
function Class1() {
console.log('Class1');
}
function Class2() {
console.log('Class2');
}
const obj1 = new Class1();
obj1 instanceof Class1; // true
obj1 instanceof Class2; // false
Class1.prototype = {};
obj1 instanceof Class1; // false
複製代碼
除此以外,Object.prototype.toString.call和construct也能夠進行數據類型的判斷。