Javascript 中检查对象是否为数组

Posted by cl9000 on December 12, 2020

预测未来最好的方法就是去创造未来。——<亚伯拉罕·林肯>

介绍

JavaScript 中使用数组是一项常见活动。有时我们在 JavaScript 中得到一个变量,我们需要它是一个数组,但我们不确定它是不是。

JavaScript 中的非原始数据类型都是对象(函数有自己的类型,但它们也是对象)。因此,使用 typeof 通常用于确定数据类型的运算符是不够的:

1
2
3
4
5
let result = { subject: 'Science', marks: 97 };
let numbers = [1, 2, 3, 4, 5];

console.log(typeof result); // Object
console.log(typeof numbers); // Object

在本文中,我们将看看如何在 JavaScript 中检查给定的变量或值是否为数组。

使用 Array.isArray() 方法

顾名思义,此方法可用于识别给定参数是否为数组。它返回一个带有结果的布尔 (true/false) 值。

例如,对于以下变量,Array.isArray() 方法可以正确确定它们是否为 1

1
2
3
4
5
6
7
8
9
let result = { subject: "Science", marks: 97 }; // Object
let numbers = [1, 2, 3, 4, 5]; // Array
let name = "Mark"; // String
let names = new Array("Jill", "Jane", "Jacqueline");

console.log(Array.isArray(result)); // false
console.log(Array.isArray(numbers)); // true
console.log(Array.isArray(name)); // false
console.log(Array.isArray(names)); // true

使用对象的构造函数属性

每个对象都有一个 constructor 属性(除了用 Object.create(null),不太可能发生的创建的对象)。我们可以直接将构造函数属性与 JavaScript 的构造函数进行比较。因此,如果我们将它与数组构造函数进行比较,我们就会知道它是否是一个数组。
注意:构造函数是初始化对象的函数。如果您使用 new 关键字创建了一个对象,那么您就是使用构造函数创建的。例如,在let myArray = new Array(1, 2)构造函数中使用的是 Array()

您可以使用构造函数属性来确定变量是否为数组:

1
2
3
4
5
6
7
8
9
let result = { subject: "Science", marks: 97 };
let numbers = [1, 2, 3, 4, 5];
let name = "Mark";
let names = new Array("Jill", "Jane", "Jacqueline");

console.log(result.constructor === Array); // false
console.log(numbers.constructor === Array); // true
console.log(name.constructor === Array); // false
console.log(names.constructor === Array); // true

使用instanceof运算符

instanceof 操作检查是否一个构造函数中的对象的原型链中找到。如果您不太熟悉 JavaScript 的原型继承,则运算符会检查对象是否由类创建,如果不是,则检查对象是否从该类派生。

typeof 运算符一样,它返回一个布尔值。要确定变量是否是数组,我们可以这样使用 instanceof

1
2
3
4
5
6
7
8
9
let result = { subject: "Science", marks: 97 };
let numbers = [1, 2, 3, 4, 5];
let name = "Mark";
let names = new Array("Jill", "Jane", "Jacqueline");

console.log(result instanceof Array); // false
console.log(numbers instanceof Array); // true
console.log(name instanceof Array); // false
console.log(names instanceof Array); // true

使用Object.prototype.call()方法

JavaScript 中的所有对象都从主原型对象继承属性,恰当地命名为 Object.prototype . 一个 toString() 方法存在 Object.prototype,这就是为什么每个对象都有一个toString()属于自己的方法。所述 toString() 的方法 Object.prototype 显示的对象的类型。

call()对象的方法执行一个函数,但改变了 this 传递给它的参数的对象的值,即它允许一个对象使用另一个对象的方法。

因此,我们可以使用 Object.prototype.toString() 打印类型,然后使用 call() 为另一个对象完成。然后我们比较该字符串值以确定它是否是一个数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let result = { subject: "Science", marks: 97 };
let numbers = [1, 2, 3, 4, 5];
let name = "Mark";
let names = new Array("Jill", "Jane", "Jacqueline");

console.log(Object.prototype.toString.call(result)); // [object Object]
console.log(Object.prototype.toString.call(numbers)); // [object Array]
console.log(Object.prototype.toString.call(name)); // [object String]
console.log(Object.prototype.toString.call(names)); // [object Array]

console.log(Object.prototype.toString.call(result) === "[object Array]"); // false
console.log(Object.prototype.toString.call(numbers) === "[object Array]"); // true
console.log(Object.prototype.toString.call(name) === "[object Array]"); // false
console.log(Object.prototype.toString.call(names) === "[object Array]"); // true

总结

在本文中,我们研究了 JavaScript 中确定对象是否为数组的几种方法。最简单的方法是 Array.isArray()最有可能在生产中使用的方法。

但是,我们总是可以利用 instanceof 运算符和其他对象属性来确定它是否是一个数组。

参考

关注【公众号】,了解更多。



支付宝打赏 微信打赏

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!