Array.isArray() returns false 对于使用 Object.create() 创建的数组

Array.isArray() returns false for array created with Object.create()

我在 Javascript 中遇到了一个奇怪的问题。可能是我这边理解不够

我有一个数组 a1:

var a1 = [1, 2, 3]

然后我向这个数组添加一个新元素a1

a1['newEntry'] = 4

然后我使用 a1:

创建一个新数组 a2
var a2 = Object.create(a1)

然后Array.isArray(a1)returnstrue,但是Array.isArray(a2)returnsfalse这是怎么回事?你能解释一下这是怎么回事吗?

Object.create() 正在创建对象而不是数组,因此在检查 Array.isArray() 时,它将 return false。

改为考虑 Array.slice(),例如

var a2 = a1.slice(0);

来源:Clone Arrays with JavaScript

来自 the MDN documentation

The Object.create() method creates a new object with the specified prototype object and properties.

当您调用 Object.create(a1) 时,您并不是在创建一个 真实的 数组,而是在创建一个 看起来像的对象 一个数组,但它不是。事实上,你甚至可以试试这个:

> a1 instanceof Array
true
> a2 instanceof Array
true

并看到两个变量的结果都是 true

Array.isArray()有什么作用呢?好吧,它显然没有使用 isinstanceof 语句。要确保变量是一个 真实的 数组,它 checks using the Object.prototype.toString() method,像这样:

> Object.prototype.toString.call(a1)
"[object Array]"
> Object.prototype.toString.call(a2)
"[object Object]"
> Object.prototype.toString.call(a1) === "[object Array]"
true
> Object.prototype.toString.call(a2) === "[object Array]"
false

这就是调用 Array.isArray() 会得到这些结果的原因:因为它执行了上述检查。现在你可以确定,即使 a2 看起来像 一个数组, 它根本就不是 数组.


另外,澄清一下:当您执行 a1['newEntry'] = 4 时,您并不是在向数组中添加新元素。您是在现有数组上创建值为 4 的 属性 newEntry。要向数组添加元素,您应该使用 push() 方法,如下所示:

> a1 = [1, 2, 3]
> a1.push(4)
> console.log(a1)
[1, 2, 3, 4]