JavaScript面試題總結系列(一)

JavaScript數據類型

提及面試,作技術的人應該都有一種感受,那就是工做的時候用到的東西均可以去查,可是當別人直接問一個問題時,讓你在不去查詢的狀況下,立即作回答,仍是有必定難度的。尤爲是面試的時候,不少程序員能力不缺,可是讓你立即說出來或者當場手寫代碼的時候,每每容易卡殼。筆者也有相似的經歷,遂決定從今天起,寫一些面試題總結以及對面試的思考。歡迎對面試有興趣的同行一塊兒來探討,共同進步。javascript

1. JavaScript中的數據類型

JavaScript中的數據類型一共有兩類:一類是基本數據類型,一類是引用數據類型。html

  • 基本數據類型有:Undefined, Null, String, Number, Boolean, Symbol
  • 引用數據類型有:Object

2. 數據類型的存放位置

  • 基本數據類型的數據存放在 棧(Stack) 上,引用數據類型的數據存放在 堆(Heap) 上。
  • 基本數據類型(也叫原始數據類型)直接存儲在棧中的簡單數據段,佔用空間小、大小固定,屬於被頻繁使用的數據,因此放入棧中存儲;
  • 引用數據類型佔用空間大、大小不固定,若是存儲在棧中,將會影響程序運行的性能。引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解釋器尋找引用值的時候,會首先檢索棧中的地址,取得地址後再從堆中得到實體。

3. 如何判斷數據類型?

判斷數據類型的方法常見的有如下幾個,下面一一來講:java

// typeof xxx;程序員

  • 使用 typeof 方法判斷數據類型的時候,常見於判斷上面提到的基本數據類型。而當使用 typeof 判斷引用數據類型的時候,typeof 只會返回 functionobject 兩種數據類型,這顯然不是咱們想要的更加精準的類型判斷。因此,判斷基本數據類型時,typeof 能夠用;判斷引用數據類型時,typeof 不建議使用;
  • typeof 對於基本類型,除了 null 均可以顯示正確的類型 (typeof判斷null時,返回的是 object );
  • typeof 對於對象,除了函數都會顯示 object
  • 對於null來講,type會返回object,這是一個存在了好久的Bug。

// A instanceof B;
instanceof 一般用來判斷 A 是不是 B 的實例,若是 AB 的實例,那麼 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 Objecttrue 時,心理多多少少有些以爲不夠乾脆利索。那麼繼續看看有沒有更高效的判斷引用數據類型的方法呢?答案是確定的。請看下面:性能

// 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的引用

4. Null,Undefined 的區別?

  • Undefined:表示不存在這個值,「缺乏值」,就是此處應該有一個值,可是尚未定義,當嘗試去讀取的時候,返回undefined
  • Null: 表示一個對象被定義了,值爲「空值」,它是一個對象,可是是一個空對象,沒有屬性和方法。在驗證Null的時候,必定要使用 ===,由於 == 沒法分辨 nullundefined

5. == 和 === 的區別?

  • ==

1.對於 == 來講,若是雙方類型相同的話,直接比大小;若是雙方的類型不同的話,就會進行類型的轉換。
2.它會先判斷是否在對比 nullundefined, 是的話返回true;
3.判斷二者是否爲 stringnumber,是的話將字符串轉爲Number;
4.判斷其中一方是否爲Boolean,是的話將boolean轉爲數字再比較;
5.判斷其中一方是否爲object, 且另外一方爲 string, number, 或者 symbol,是的話將object轉爲原始類型再進行判斷。

  • ===

直接判斷二者類型和值是否相同。

6. 類型轉換

  • 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...
相關文章
相關標籤/搜索