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

时间:2015-12-09 11:43:27

标签: javascript javascript-objects

我在Javascript中面临一个奇怪的问题。这可能是由于我不了解。

我有一个数组a1

var a1 = [1, 2, 3]

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

a1['newEntry'] = 4

然后我使用a2

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

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

2 个答案:

答案 0 :(得分:3)

来自the MDN documentation

  

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

当您致电Object.create(a1) 但未创建真实数组时,您正在创建一个看起来像数组<的对象/ strong>,但事实并非如此。事实上,你甚至可以试试这个:

> 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时,你没有向数组中添加新元素。您现在在现有阵列上创建值为newEntry的属性4。要向数组添加元素,您应该使用push()方法,如下所示:

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

答案 1 :(得分:0)

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

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

var a2 = a1.slice(0);

来源:Clone Arrays with JavaScript