JS自问自答『数据类型与类型检测』

秋招已经如火如荼的展开了,即将奔赴战场前,该对自己所学的知识进行一下温习和整理了,开始学习JavaScript就是从数据类型入手的,所以从数据类型开始对知识进行复习,查漏补缺。

在JavaScript中有哪些数据类型?

JavaScript中的数据类型有6种:

基础数据类型5种:BooleanStringNumberundefinednull

复杂数据类型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后面是可以不跟()的,加()只是为了看起来方便,不过这也造成了一些误解,但它就是一个一元运算符。

一元运算符有很高的优先级,即使我们做多个 && || 的逻辑判断时,typeof依然可以连着写,而不需要使用()把每一个typeof包裹起来

typeof a === 'number' && typeof b ==='string';
复制代码

那么如何对Object类型进行判断?

其实对Object判断主要是区分某个对象是否为数组,有以下方法:

1.使用instanceof判断

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自问自答『数据类型与类型检测』

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值