JS自問自答『數據類型與類型檢測』

秋招已經如火如荼的展開了,即將奔赴戰場前,該對本身所學的知識進行一下溫習和整理了,開始學習JavaScript就是從數據類型入手的,因此從數據類型開始對知識進行復習,查漏補缺。git

在JavaScript中有哪些數據類型?

JavaScript中的數據類型有6種:es6

基礎數據類型5種:BooleanStringNumberundefinednullgithub

複雜數據類型1種:Object面試

若是在ES6中,新增了一種symbol類型,表示獨一無二的值。而且symbol類型在初始化的時候不須要使用new操做符。數組

如何對數據類型進行判斷?

typeof (true);                //"boolean"
typeof ("xwj");               //"string"
typeof (10);                  //"number"
typeof (undefined);           //"undefined"
typeof (null);                //"object"
typeof ({});                  //"object"
複製代碼

對於普通的數據類型來講,只須要使用typeof來進行判斷就能夠來,數據類型有6種,typeofde返回的值也有6種(在es6中是7種,包括symbol類型的返回值),可是在typeof的返回值裏面,null和Object返回的都是Object,而其他的都是對應的字符串,包括function瀏覽器

function a () {}
typeof a;                   //"function"
複製代碼

typeof後面常常會跟一個(),這對括號能否省略?

先想一想typeof究竟是什麼?它的後面常常跟一對(),看起來確實有點像一個函數,但其實否則,typeof它是一個一元運算符,和+ - * / 是同樣的,因此typeof後面是能夠不跟()的,加()只是爲了看起來方便,不過這也形成了一些誤解,但它就是一個一元運算符。app

一元運算符有很高的優先級,即便咱們作多個 && || 的邏輯判斷時,typeof依然能夠連着寫,而不須要使用()把每個typeof包裹起來函數

typeof a === 'number' && typeof b ==='string';
複製代碼

那麼如何對Object類型進行判斷?

其實對Object判斷主要是區分某個對象是否爲數組,有如下方法:學習

1.使用instanceof判斷this

console.log(a instanceof Array);    //true
複製代碼

2.使用原型鏈上的constructor判斷

console.log(a.__proto__.constructor===Array);   //true
複製代碼

這兩種方法,看上去不錯,可是實際上仍是有些漏洞的,當咱們的頁面中存在多個frame,而且咱們的判斷是在兩個iframe之間的時候,就頗有可能出現問題了。因爲每一個iframe都屬於本身的window對象,跨frame實例化的對象彼此是不共享原型鏈的,所以致使上述檢測代碼失效

var iframe = document.createElement('iframe');          //建立iframe
document.body.appendChild(iframe);                      //添加到body中
xArray = window.frames[window.frames.length-1].Array;   //將xArray指向第二個iframe的引用
var arr = new xArray(1,2,3);                            // 聲明數組[1,2,3]
alert(arr instanceof Array);                            // false
alert(arr.constructor === Array);                       // false 
複製代碼

還有兩種更值得推薦的方法:

3.使用Array.isArray() 方法判斷

var a = [];
console.log(Array.isArray(a));   //true
複製代碼

ECMAScript 5加入了 Array.isArray() 方法,能夠準確地檢測一個值是否爲數組。可是它有個缺點就是不支持IE8以前的版本,不過如今連淘寶都放棄了對IE8如下瀏覽器的支持,這個問題大概能夠忽略

4.使用Object.prototype.toString.call()方法判斷

這是一種無懈可擊的判斷數組的方法,全部typeof返回值爲"object"的對象都有一個內置屬性:[[Class]]

Object.prototype.toString()獲取到這個內置屬性,而後根據它返回相似於"[object Array]"的字符串做爲結果,利用這個方法,再配合call改變toString的this引用爲待檢測的對象,咱們能夠取得任何對象的內部屬性[[Class]]

var a = {};
var b = [];
function c () {}
console.log(Object.prototype.toString.call(a));     //[Object Object]
console.log(Object.prototype.toString.call(b));     //[Object Array]
console.log(Object.prototype.toString.call(c));     //
複製代碼

Object.prototype.toString方法在ECMAScript 3中規範中就存在,也不存在兼容性問題。

小結

數據類型在面試過程當中,也是常常要被考察的第一個問題,但每每被咱們所忽略,我以自問自答的方式記錄下來,補補以前欠下的筆記。

關於Object.prototype.toString()方法,這裏有一篇不錯的文章:JavaScript類型檢查與內部屬性[[Class]]

原文連接:行無忌的我的博客:JS自問自答『數據類型與類型檢測』

相關文章
相關標籤/搜索