typeof 對於基本類型,除了 null 均可以顯示正確的類型數組
000 開頭表明是對象,然而 null 表示 爲全零,因此將它錯誤的判斷爲 object 。
bash
typeof 沒法判斷數組,對象.spa
能夠經過 Object.prototype.toString. call(xx)。這樣咱們就能夠得到相似 [Object Type] 的字符串。
prototype
instanceof 能夠正確的判斷對象的類型,由於內部機制是經過判斷對象的原型鏈 中是否是能找到類型的 prototype。
code
ToString負責處理非字符串到字符串的強制類型轉換cdn
null轉換爲'null',undefined轉換爲'undefined',其餘基本類型都調用基本類型的包裝對象屬性toString()並返回值。對象
const a = 123;
const _a = new Number(123);
console.log(String(a), _a.toString()); //'123' '123' 複製代碼
數字的字符串化遵循通用規則,可是極小極大數字使用指數形式blog
const a = 1.07*1000*1000*1000*1000*1000*1000*1000;
console.log(String(a)); //'1.07e+21'複製代碼
對於普通對象來講,除非自行定義,不然toString()返回Object.prototype.toString()的值,其餘對象有本身的toString()方法則調用本身的該方法.原型鏈
const b = {};
console.log(String(b)); //[object object]複製代碼
對於數組來講會轉成以「,」拼接各項的字符串字符串
const arr = [{s:1},2,3]
console.log(arr.toString()) //"[object Object],2,3"複製代碼
ToNumber負責處理非數字到數字的強制類型轉換
true轉換爲1,false轉換爲0,undefined轉換爲NaN,null轉換爲0
console.log(Number(null)); //0
console.log(Number(undefined)); //NaN
console.log(Number(true)); //1
console.log(Number(false)); //0複製代碼
對字符串的處理遵循數字常量的相關規定/語法,處理失敗時返回NaN
console.log(Number('123')); //123
console.log(Number('0b111')); //7
console.log(Number('0o123')); //83
console.log(Number('0x123')); //291
console.log(Number('123a')); //NaN
console.log(Number('a123')); //NaN
複製代碼
const arr = [1, 2, 3];
console.log(Number(arr)); //NaN
console.log(Number(arr.toString())); //NaN
const num = new Number(123);
console.log(Number(num)); //123
console.log(Number(num.valueOf())); //123
const bool = new Boolean(true);
console.log(bool.valueOf()); //true
console.log(Number(bool)); //1
console.log(Number(bool.valueOf())); //1
const obj1 = {
toString:()=>"21"
}
const obj2 = {
valueOf:()=>"42",
toString:()=>"21"
}
const obj3 = {
a:1
}
console.log(Number(obj1)); //21
console.log(Number(obj2)); //42
console.log(obj3.toString()); //[object Object]
console.log(Number(obj3)); //NaN
const obj = Object.create(null);
console.log(Number(obj)); //TypeError
複製代碼
ToBoolean負責處理非布爾值到布爾值的強制類型轉換,規則以下
能夠被轉換爲false的值(undefined,null,false, 0和NaN,'')
其餘都被轉換爲true(切記:封裝對象均被轉爲true)
隱式強制類型轉換爲字符串
一元運算符加號(+)首先把非基本類型經過ToPrimitive抽象操做轉換爲基本類型,若是加號中的兩項有一項是字符串,另外一項則進行ToString操做,進行字符串拼接,若是是布爾值加數字,則對布爾進行ToNumber操做再求和
隱式強制類型轉換爲數字,經過一元運算符-、/、*轉換,遵循ToNumber的抽象值操做規則
隱式強制類型轉換爲布爾值
if(..)語句中的條件判斷表達式
for(..;..;..)語句的第二個條件判斷表達式
while(..)和do..while(..)的條件判斷表達式
?:中的條件判斷表達式
邏輯運算符||和&&左邊的操做數(a||b等同於a?a:b,a&&b等同於a?b:a)