我想了解更多判断数组的方式

2,034 阅读2分钟

9021年底了,突然想在这个最后一个月准备一下,试试机会,能否更进一步。所以开始准备一些基础知识,也随带总结出来给各位想换工作的同学。希望大家能找到自己想要的工作。祝大家好运!

如果你知道更多的方式评论给我。谢谢!

总结回顾

一、instanceof

var array = [];
array instanceof Array;

PS:instanceof的实现原理(判断左边对象的原型链上是否存在右边原型)

function myInstanceof(left, right) {
    let right = right.prototype;
    let left = left.__proto__;
    while (true) {
        if (left === null || rigth === undefined) {
            return false;
        } else {
            if (left === right) {
                return true;
            } else {
                left = left.__proto__;
            }
        }
    }
}

二、constructor

var array = [];
array.constructor === Array

PS:instanceof和constructor判断的变量,必须在当前页面申明的,比如,一个页面(父页面)一样一个框架,框架中引入一个页面(子页面),在子页面中声明的array,并将其复制给父元素的一个变量,判断该变量,将返回false。

原因:array是复合类型。在传递的过程中,仅仅是引用地址的传递。 每个页面的array原生对象引用的地址是不一样的,在子页面中声明的array,所对应的构造函数,是子页面的array对象,在父页面进行判断时,使用的并不是子页面的array;

三、__ proto__.constructor

var array = [];
array.__proto__.constructor === Array;

每个对象都有一个__proto__属性,该属性指向构造函数的原型对象,对象可以通过这个属性访问到构造函数的原型对象,__proto__属性是没有写入ES6正文的属性, 而是写入了附录中,原因是他本质上是一个内部属性,而不是一个正式的API,只是被浏览器广泛支持,才被加入ES6,只有浏览器有这个属性,其他环境是没有。所以重某种角度来说,我们是不建议在实际生产中使用的,而是使用Object.getPrototypeOf(target)来进行操作。

var array = [];
Object.getPrototypeOf(array).constructor === Array;

四、Array.isArray

var array = [];
Array.isArray(array);

es6中加入了新的判断方法,存在兼容性问题。

五、toString(最常用)

考虑Array.isArray的兼容性问题

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

}
var array = [];
Array.isArray(array);