在JavaScript中,数据类型检测有如下方法:
1 | typeof |
typeof()
typeof
操作符返回一个字符串,表示未经计算的操作数的类型。
1 | // 基本类型 |
结论: 通过typeof
肯定是不行的,对于一些基本类型而言,typeof
是可以判断出数据类型,但是需要判断一些引用类型,不能具体到某一个类型,比如array
使用instanceof
instanceof是干嘛用的?
instanceof
运算符用于监测构造函数的prototype
属性是否出现在某个实例对象的原型链(prototype chain)上
简单理解就是:
监测某个实例是否属于某个类
所有出现在实例原型链上的类都会返回true
使用的语法如下
1 | object instanceof constructor |
举个例子:
1 | function Chace() {}; |
用instanceof
判断是否数组
1 | const a = []; |
用代码模拟instanceof
的查找过程:
1 | const _instanceof = function (instance, Class) { |
使用instanceof
存在一个问题,假定浏览器只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array
构造函数,如果从一个框架向另一个框架传入一个数组,那么传入的数组与第二个框架中原生创建的数组分别具有各自不同的构造函数,为了解决这个问题,ECMAScript 5中新增了Array.isArray()
方法。这个方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的
1 | if (Array.isArray(value)) { |
用constructor
方法
Object.prototype.toString.call()
toString()
方法返回一个表示该对象的字符串。
1 |
ES5中的APIArray.isArray()
ES5中新增了一个方法:
Array.isArray()
用于确定传递的值是否是一个Array
。(只支持IE9+、Firefox 4+、Safari 5+、Opera 10.5+和Chrome,IE8之前的版本不兼容)
1 | let array = [1, 2, 3]; |
最佳写法:
1 | var arr = [1, 2, 3, 4, 5, 7]; |
参考连接
MDN-JavaScript
typeof
MDN-JavaScript ‘instanceof’
MDN-JavaScriptObject.toString
MDN-JavaScriptArray.isArray
MDN-JavaScriptObject.getPrototypeOf()
在JavaScript中,如何判断数组是数组?