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

9021年末了,忽然想在这个最后一个月准备一下,试试机会,可否更进一步。因此开始准备一些基础知识,也随带总结出来给各位想换工做的同窗。但愿你们能找到本身想要的工做。祝你们好运! html

若是你知道更多的方式评论给我。谢谢!es6

总结回顾面试

1、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__;
            }
        }
    }
}
复制代码

2、constructor

var array = [];
array.constructor === Array
复制代码

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

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

3、__ proto__.constructor

var array = [];
array.__proto__.constructor === Array;
复制代码

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

var array = [];
Object.getPrototypeOf(array).constructor === Array;
复制代码

4、Array.isArray

var array = [];
Array.isArray(array);
复制代码

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

5、toString(最经常使用)

考虑Array.isArray的兼容性问题ui

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

}
var array = [];
Array.isArray(array);
复制代码
相关文章
相关标签/搜索