【準備面試】- JS - 數據類型

內置類型

JS 中分爲七種內置類型,七種內置類型又分爲兩大類型:基本類型和對象(Object)。 基本類型有六種: null,undefined,boolean,number,string,symbol。

Typeof

typeof 對於基本類型,除了 null 均可以顯示正確的類型數組


000 開頭表明是對象,然而 null 表示 爲全零,因此將它錯誤的判斷爲 object 。
bash

instanceof 和 Object.prototype.toString.call

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

複製代碼
對象(包括數組)會首先按照ToPrimitive抽象操做被轉換爲相應的基本類型值,再按照前兩條規則處理;若是某個對象即不存在valueOf方法也不存在toString方法,則會產生TypeError錯誤(例如Object.create(null)不存在以上兩種方法)

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)

相關文章
相關標籤/搜索