秋招已经如火如荼的展开了,即将奔赴战场前,该对本身所学的知识进行一下温习和整理了,开始学习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]]](https://blog.csdn.net/q105684...