提及面試,作技術的人應該都有一種感受,那就是工做的時候用到的東西均可以去查,可是當別人直接問一個問題時,讓你在不去查詢的狀況下,立即作回答,仍是有必定難度的。尤爲是面試的時候,不少程序員能力不缺,可是讓你立即說出來或者當場手寫代碼的時候,每每容易卡殼。筆者也有相似的經歷,遂決定從今天起,寫一些面試題總結以及對面試的思考。歡迎對面試有興趣的同行一塊兒來探討,共同進步。javascript
JavaScript中的數據類型一共有兩類:一類是基本數據類型,一類是引用數據類型。html
Undefined
, Null
, String
, Number
, Boolean
, Symbol
Object
判斷數據類型的方法常見的有如下幾個,下面一一來講:java
// typeof xxx;程序員
typeof
方法判斷數據類型的時候,常見於判斷上面提到的基本數據類型。而當使用 typeof
判斷引用數據類型的時候,typeof
只會返回 function
和 object
兩種數據類型,這顯然不是咱們想要的更加精準的類型判斷。因此,判斷基本數據類型時,typeof
能夠用;判斷引用數據類型時,typeof
不建議使用;typeof
對於基本類型,除了 null
均可以顯示正確的類型 (typeof
判斷null
時,返回的是 object
);typeof
對於對象,除了函數都會顯示 object
;null
來講,type
會返回object
,這是一個存在了好久的Bug。// A instanceof B;instanceof
一般用來判斷 A
是不是 B
的實例,若是 A
是 B
的實例,那麼 A instanceof B
返回 true
; 不然,返回 false
。面試
instanceof
的原理或者說內部機制是:經過判斷對象的原型鏈中是否是能找到類型的 prototype
。數組
例如:app
var a = {}; a instanceof Object; // true var b = []; b instanceof Array; // true
到這裏的時候,看似都是正常的,沒有什麼問題。那麼若是發揮孔乙己」四個回字「的想法呢? 好比:函數
var c = {}; c instanceof Array; // false var d = []; d instanceof Object; // true
這個時候,發現數組在使用 instanceof
的時候,既有屬於數組的狀況,又有屬於對象的狀況。雖然,咱們能夠僅僅使用 A instanceof Array
來判斷 A
究竟是不是數組,可是當數組也能夠被 instanceof Object
爲 true
時,心理多多少少有些以爲不夠乾脆利索。那麼繼續看看有沒有更高效的判斷引用數據類型的方法呢?答案是確定的。請看下面:性能
// Object.prototype.toString.call( xxx );
其中 "xxx" 就是咱們想要判斷的數據類型。ui
這裏的toString()
是Object
的原型方法,調用該方法後,會返回當前對象的 [[class]]
屬性,這是一個內部屬性,其格式爲 [object Xxx]
, 其中 "Xxx"
就是對象的類型。
對於 Object
對象而言,直接調用 toString()
方法便可返回 [object Object]
;而對於其餘對象而言,須要經過調用call() / apply()
方法才能返回正確的類型信息。好比:
Object.prototype.toString.call('') ; // [object String] Object.prototype.toString.call(1) ; // [object Number] Object.prototype.toString.call(true) ; // [object Boolean] Object.prototype.toString.call(Symbol()); //[object Symbol] Object.prototype.toString.call(undefined) ; // [object Undefined] Object.prototype.toString.call(null) ; // [object Null] Object.prototype.toString.call(new Function()) ; // [object Function] Object.prototype.toString.call(new Date()) ; // [object Date] Object.prototype.toString.call([]) ; // [object Array] Object.prototype.toString.call(new RegExp()) ; // [object RegExp] Object.prototype.toString.call(new Error()) ; // [object Error] Object.prototype.toString.call(document) ; // [object HTMLDocument] Object.prototype.toString.call(window) ; //[object global] window 是全局對象global的引用
Undefined
:表示不存在這個值,「缺乏值」,就是此處應該有一個值,可是尚未定義,當嘗試去讀取的時候,返回undefined
。Null
: 表示一個對象被定義了,值爲「空值」,它是一個對象,可是是一個空對象,沒有屬性和方法。在驗證Null
的時候,必定要使用 ===
,由於 ==
沒法分辨 null
和 undefined
。1.對於 ==
來講,若是雙方類型相同的話,直接比大小;若是雙方的類型不同的話,就會進行類型的轉換。
2.它會先判斷是否在對比 null
和 undefined
, 是的話返回true
;
3.判斷二者是否爲 string
和 number
,是的話將字符串轉爲Number
;
4.判斷其中一方是否爲Boolean
,是的話將boolean
轉爲數字再比較;
5.判斷其中一方是否爲object
, 且另外一方爲 string
, number
, 或者 symbol
,是的話將object
轉爲原始類型再進行判斷。
直接判斷二者類型和值是否相同。
Boolean
undefined
, null
, false
, NaN
, ""
, 0
, -0
,其餘全部的值都會轉爲 true
,包括全部對象。對象在轉換爲基本類型時,首先會調用 valueOf
,而後調用 toString
,而且這兩個方法也是能夠重寫的。
1.只有當使用加法運算時,其中一方是字符串類型,就會把另外一方也轉爲字符串類型;
2.其餘運算,只要有一方是數字,那麼另外一方就轉化爲數字;
3.加法運算會出發三種類型轉換:將值轉換爲原始值、轉換爲數字、轉換爲字符串。
(本節完)
參考連接:
https://www.cnblogs.com/yan-y...
https://www.cnblogs.com/M-rig...
https://blog.csdn.net/m0_3768...
https://www.cnblogs.com/echol...