个人博客

学习加油站


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

JS 判断对象是不是数组

发表于 2019-10-28 更新于 2019-10-29

JS 判断对象是不是数组

前端面试或笔试经典题目之一——判断对象/数组

一、用 instanceof 操作符判断

instanceof运算符可以用来判断某个构造函数的prototype属性所指向的对象是否存在于另外一个要检测对象的原型链上

1
2
3
4
5
const a = [];
const b = {};
console.log(a instanceof Array); //true
console.log(a instanceof Object);//true,在数组的原型链上也能找到Object构造函数
console.log(b instanceof Array); //false

注意:instanceof操作符的问题在于,它假定只有一个全局环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。
如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。

二、用对象的 constructor 属性判断

实例化的数组拥有一个constructor属性,这个属性指向生成这个数组的方法

1
2
3
4
const a = [];
const b = {}
console.log(a.constructor == Array); //true
console.log(b.constructor == Array); //false

注意: constructor属性是可以被重写的 。 constructor属性一旦被修改,就不能确保一定是数组 。因此, 这种方法来判断数组是不靠谱的 。

三、用 Object.prototype.toString 判断

每一个继承自Object的对象都拥有toString的方法

使用call或者apply方法来改变toString方法的执行上下文

1
2
3
4
const a = []
const b = {}
console.log(Object.prototype.toString.call(a)==='[object Array]') // true
console.log(Object.prototype.toString.call(b)==='[object Array]') // false

四、用 Array.isArray()判断

Array.isArray() 用于确定传递的值是否是一个数组

1
2
3
4
const a = [];
const b = {};
Array.isArray(a);//true
Array.isArray(b);//false

目前所有主流浏览器和IE9+都对其进行了支持,IE8及以下浏览器不支持该方法

Polyfill—— 假如不存在 Array.isArray(),则在其他代码之前运行下面的代码将创建该方法。

1
2
3
4
5
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
# JS # ES6 # Array # Object
JavaScript 数组去重(一)
z-index和层叠上下文
  • 文章目录
  • 站点概览

WYP

知识管理,自我管理
12 日志
8 标签
GitHub E-Mail 简书
  1. 1. JS 判断对象是不是数组
    1. 1.0.1. 一、用 instanceof 操作符判断
    2. 1.0.2. 二、用对象的 constructor 属性判断
    3. 1.0.3. 三、用 Object.prototype.toString 判断
    4. 1.0.4. 四、用 Array.isArray()判断
© 2019 – 2021 wyp