资讯专栏INFORMATION COLUMN

JS判断数组的六种方法详解

xiaoxiaozi / 261人阅读

摘要:对象构造函数的判断用法的每个实例都有构造函数,用于保存着用于创建当前对象的函数如上所示,的实例的跟对象是相等的那么我们就可以用此来判断数组了原型链上的用法属性表示构造函数的原型其中有一个方法是用于测试一个对象是否存在于另一个对象的原型链上。

在JS中,数组是属于Object类型的,也就是属于引用类型(引用类型存放在堆内存中,在栈内存会有一个或者多个地址来指向这个堆内存)。

所以对于引用类型,我们不能typeof来判断具体的类型,因为返回的都是‘object’。

接下来,我将介绍六种判断方法,并且对这六种方法进行逐一解析

① instanceof 操作符判断

用法:arr instanceof Array
instanceof 主要是用来判断某个实例是否属于某个对象

function obj(){}
let o1 = new obj();
console.log(o1 instanceof obj);  // true

那么我们用instanceof 来判断数组的方法如下:

let arr = [];
console.log(arr instanceof Array); // true
但是 instanceof 会有一个问题,它的问题在于假定只有一个全局执行的环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境从而存在两个以上不同版本的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有不同的构造函数。
②对象构造函数的 constructor判断

用法:arr.constructor === Array
Object的每个实例都有构造函数 constructor,用于保存着用于创建当前对象的函数

function obj(){}
let o1 = new obj();
console.log(o1.constructor === obj);  // true

如上所示,obj 的实例 o1 的 constructor 跟 obj 对象是相等的
那么我们就可以用此来判断数组了

let arr = [];
console.log(arr.constructor === Array); // true
③Array 原型链上的 isPrototypeOf

用法:Array.prototype.isPrototypeOf(arr)
Array.prototype  属性表示 Array 构造函数的原型
其中有一个方法是 isPrototypeOf() 用于测试一个对象是否存在于另一个对象的原型链上。

let arr = [];
console.log(Array.prototype.isPrototypeOf(arr)); // true
④Object.getPrototypeOf

用法:Object.getPrototypeOf(arr) === Array.prototype
Object.getPrototypeOf() 方法返回指定对象的原型

所以只要跟Array的原型比较即可

let arr = [];
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true
⑤Object.prototype.toString

用法:Object.prototype.toString.call(arr) === "[object Array]"

虽然Array也继承自Object,但js在Array.prototype上重写了toString,而我们通过toString.call(arr)实际上是通过原型链调用了。

let arr = [];
console.log(Object.prototype.toString.call(arr) === "[object Array]"); // true
⑥Array.isArray

用法:Array.isArray(arr)
ES5中新增了Array.isArray方法,IE8及以下不支持

Array.isArray ( arg )
isArray 函数需要一个参数 arg,如果参数是个对象并且 class 内部属性是 "Array", 返回布尔值 true;否则它返回 false。采用如下步骤:
           如果 Type(arg) 不是 Object, 返回 false。
           如果 arg 的 [[Class]] 内部属性值是 "Array", 则返回 true。
           返回 false.

let arr = [];
console.log(Array.isArray(arr)); // true

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100773.html

相关文章

  • 区别对象和数组六种方法

    摘要:区别对象和数组的六种方法方法一利用方法通过调用方法试着将该变量转化为代表其类型的。该方法对于真正的可行参数对象转化为时返回会转化失败此外,对于含有数字长度属性的类也会转化失败。 区别对象和数组的六种方法(1)方法一:利用toString方法通过调用toString( )方法试着将该变量转化为代表其类型的string。该方法对于真正的array可行;参数对象转化为string时返回[ob...

    senntyou 评论0 收藏0
  • Javascript中数组去重六种方法

    摘要:数组去重第一种方法先对数组进行排序,排好序,然后把数组的当前项和后一项进行比较,相同则使用数组的相同的位置,,但是为了防止数组塌陷,每次删除数组元素的时候要把的值减一。 数组去重 第一种方法: 先对数组进行排序sort(),排好序,然后把数组的当前项和后一项进行比较,相同则使用数组的splice(相同的位置,1),但是为了防止数组塌陷,每次删除数组元素的时候要把i的值减一。 ...

    CodeSheep 评论0 收藏0
  • JavaScript六种基本数据类型

    摘要:数据类型数据类型指的就是字面量类型在中一共有六种数据类型字符串数值布尔值空值未定义对象其中属于基本数据类型而属于引用数据类型字符串在中使用字符串需要使用引号括起来使用双引号或单引号都可以不能混合使用引号不能嵌套数值型在中所有数值类型都                                    数据类型 数据类型指的就是字面量类型 在JS中一共有六种数据类型 ...

    CollinPeng 评论0 收藏0
  • JS基础知识回顾-1

    摘要:原始类型数组,循环变量不能以数字开头,因为如果这样编译器则无法区别数字和变量。可以直接修改数组的值如就变成了输出为循环和判断 Part1 原始类型,数组,循环 Variables 变量不能以数字开头,因为如果这样编译器则无法区别数字和变量。 养成好习惯每句话后面加分号 Primitive data types 包括Number,String, Boolean, Undefined...

    CoorChice 评论0 收藏0
  • Zepto 源码分析 4 - 核心模块入口

    摘要:对象构造函数读入的两个参数与在中也有明确的规范,用以保证构造函数的简单性。 承接第三篇末尾内容,本篇结合官方 API 进入对 Zepto 核心的分析,开始难度会比较大,需要重点理解几个核心对象的关系,方能找到线索。 $() 与 Z 对象创建 Zepto Core API 的首个方法 $() 按照其官方解释: Create a Zepto collection object by pe...

    xzavier 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<