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);
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]
我在 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);
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]