博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你知道判断数据类型的方法有哪些?
阅读量:6039 次
发布时间:2019-06-20

本文共 2769 字,大约阅读时间需要 9 分钟。

typeof

使用typeof来判断数据类型是最为常见的,但是typeof只能判断基本的数据类型,面对对象类型、null、Array返回的都是Object类型。

var str = '2323';typeof str // string;var num = 123;typeof num // number;var bn = falsetypeof bn // booleantypeof undefined // undefinedtypeof null // objecttypeof [1,2,3] // objecttypeof {name: 3434} // objecttypeof function(){} // function复制代码

注意:使用typeof判断function时,返回的是function。

Object.prototype.toString.call()

在javascript中,所有数据类型的父类都是Object,每一个继承Object的对象都有toString方法,因此在没有重写toString的情况下。toString方法返回的是[Object type],其中type是对象的类型,除了Object类型的对象外,其他类型直接使用 toString 方法时,会直接返回都是内容的字符串,所以我们需要使用call或者apply方法来改变toString方法的执行上下文。

// 直接使用toString方法var arr = [1, 2];arr.toString(); // "1,2"// 使用Object.prototype.toString.call()方法读取类型Object.prototype.toString.call(arr); // '[object Array]'复制代码

使用Object.prototype.toString.call()判断数据类型的好处就是,所有基本的数据类型都能进行判断,包括null和undefined

Object.prototype.toString.call('string') // '[object String]'Object.prototype.toString.call(123) // '[object Number]'Object.prototype.toString.call(null) // '[object Null]'Object.prototype.toString.call(undefined)// '[object undefined]'Object.prototype.toString.call(function(){}) // '[object Function]'Object.prototype.toString.call([1,2,3])// '[object Array]'Object.prototype.toString.call({name: 'yf'}) // '[object Object]'Object.prototype.toString.call(Symbol(1)) //'[object Symbol]'// 注意Symbol是一种特殊的构造函数,创建实例时不需要使用new关键字复制代码

instanceof

判断数组类型我们还可以使用instanceof。 instanceof的具体判断流程如下:

function instanceof (A, B) {    var O = B.prototype;    var A = A.__proto__;    while(true) {        if (A === null) {            return false;        }else if(O === A) {            return true;        }        A = A.__proto__;    }}复制代码

从上面的判断过程可以看出,instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。其实原型链的查找过程。A instanceof Array;这个判断的过程其实就是查找A的原型链中是否能找到B.prototype。

[] instanceof Array // true[] instanceof Object // true// [].__proto__ = Array.prototype// Array.prototype.__proto__ = Object.prototype// [].__proto__.__proto__ = Object.prototype;复制代码

为什么[] instanceof Object返回的也是true呢。因为在Javascript中一切皆对象,所有类型的最终原型都指向对象,这个概念我们可以查看原型链这一章的内容。

注意:instanceof 只能用来判断对象类型,原始类型不可以。

var str = '2233';str instanceof String; // false;var strObj = new String('2233');strObj instanceof String // true复制代码

Array.isArray()

在ES5中新增了Array.isArray()方法,用来判断是否为数组。 当检测Array实例时,Array.isArray优于instanceof,当不存在Array.isArray()时,可以使用Object.prototype.toString.call()实现。

if (!Array.isArray) {    Array.isArray = function(arg) {        return Object.prototype.toString.call(arg) === '[object Array]';    };}复制代码

使用constructor方法

constructor属性返回对创建此对象的数组函数的引用。就是返回对象相应的构造函数。

[].constructor === Array // true;var obj = new Object();obj.constructor === Object // true;"string".constructor === String // true复制代码

转载于:https://juejin.im/post/5cab2885e51d456e89634999

你可能感兴趣的文章
为什么英雄难过美人关?
查看>>
poj 3009 Curling 2.0
查看>>
Tomcat7安装配置 for Ubuntu
查看>>
Linux:命令执行控制&&与||
查看>>
麻球繁衍
查看>>
FreeRTOS栈溢出检查
查看>>
linux下,远程连接mysql
查看>>
浅谈js闭包(closure)
查看>>
【regex】POSIX标准正则表达式库
查看>>
C#集成FastReport.Net并将模板保存到数据库
查看>>
python装饰器(decorator)两种模式探讨集合
查看>>
高级 DO 语法
查看>>
Jexus下配置多个站点
查看>>
Xcode编辑器的技巧与诀窍
查看>>
String、StringBuffer与StringBuilder之间区别
查看>>
工作第十三周:身体掏空,精神饱满
查看>>
Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
查看>>
ios扩展机制objc_setAssociatedObject,objc_getAssociatedObject
查看>>
批量添加-fno-objc-arc
查看>>
二叉树的层序遍历
查看>>