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



我在Javascript中遇到了一个奇怪的问题。这可能是由于我方缺乏理解。

我有一个数组a1:

var a1 = [1, 2, 3]

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

a1['newEntry'] = 4

然后我使用a1:创建了一个新的数组a2

var a2 = Object.create(a1)

然后Array.isArray(a1)返回true,但是Array.isArray(a2)返回false这里发生了什么你能解释一下这是怎么发生的吗?

来自MDN文档:

Object.create()方法使用指定的原型对象和属性创建一个新对象。

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

> a1 instanceof Array
true
> a2 instanceof Array
true

并且看到对于这两个变量的结果都是CCD_ 11。

那么Array.isArray()是干什么的呢?它显然没有使用isinstanceof语句。为了确保变量是真实数组,它使用Object.prototype.toString()方法进行检查,如下所示:

> 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]

Object.create()创建的是Object而不是Array,因此在检查Array.isArray()时,它将返回false。

考虑Array.slice(),例如

var a2 = a1.slice(0);

来源:使用JavaScript 克隆阵列

最新更新