秋招已經如火如荼的展開了,即將奔赴戰場前,該對本身所學的知識進行一下溫習和整理了,開始學習JavaScript就是從數據類型入手的,因此從數據類型開始對知識進行復習,查漏補缺。git
JavaScript中的數據類型有6種:es6
基礎數據類型5種:Boolean
、String
、Number
、undefined
、null
github
複雜數據類型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後面是能夠不跟()的,加()只是爲了看起來方便,不過這也形成了一些誤解,但它就是一個一元運算符。app
一元運算符有很高的優先級,即便咱們作多個 && || 的邏輯判斷時,typeof依然能夠連着寫,而不須要使用()把每個typeof包裹起來函數
typeof a === 'number' && typeof b ==='string';
複製代碼
其實對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]]