js中如何判断变量是不是数组(Array)

410 阅读2分钟

简介

走起,来吧少年 ,咋们直接奔入主题

1. 不是很厉害的typeof方法

var ary = [1,2,3];
console.log(typeof ary); //输出结果是Object
  • 由此可见typeof是无法判断变量是否是数组类型,只能判断其类型

2. instanceof 方法

var ary = [1,2,3];
console.log(ary instanceof Array)//true;
  • ary instanceof Array的含义是:判断Arrayprorotype属性是不是在ary的原型链上,通俗来说就是ary__proto__一层层向上找,看能否找到 Array.prototype 是返回true,否返回false;
    function Person() {};
    function Student() {};
    Student.prototype = new Person();
    var s = new Student();
    console.log(s instanceof Student); //true
    console.log(s instanceof Person); //true
       ```
    
  • JavaScript instanceof运算符深入剖析

3. constructor 方法

var ary = [1,2,3];
console.log(ary.__proto__.constructor==Array);//true
console.log(ary.constructor==Array)//true
// 这两段代码含义是一样的
  • ary.__proto__.constructor==Arrayary.constructor==Array ary是有一个叫Array的函数实例化的

4. isArray() 方法

const a = [];
const b = {};
Array.isArray(a);//true
Array.isArray(b);//false
  • 很显然isArray是可以判断变量是不是数组的,但是,Array.isArray() 是ECMAScript5中引入了方法,用于专门判断一个对象是不是数组,是返回true,不是返回false;目前所有主流浏览器和IE9+都对其进行了支持,IE8及以下浏览器不支持该方法。

5. 用Object的toString方法判断

var ary = [1,23,4];
function isArray(o){
    return Object.prototype.toString.call(o)=='[object Array]';
}
console.log(isArray(ary)); //true
  • Object.prototype里面有个toString()方法
    Object.prototype.toString = function(){
        在函数里this正常指向的就是调用这个函数的对象也就是(Object.prototype) 
        js中call()方法是改变this的指向, a.call(b),  b替换了a
    }

instanceof 和 constructor 缺陷

```js
//例子
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);

var arr = [1,2,3];
xArray = window.frames[0].Array;  //iframe中的构造函数
var arrx = new xArray(4,5,6);
console.log(arrx instanceof Array);  //false
console.log(arrx.constructor == Array);// false
```
  • 由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共/享原型链的,因此导致instanceof和constructor失效。