我在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
。 这里发生了什么?你能解释一下这是怎么回事吗?
答案 0 :(得分:3)
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);