Javascript 为什么jQuery';s$.makeArray是否忽略字符串键?

Javascript 为什么jQuery';s$.makeArray是否忽略字符串键?,javascript,jquery,arrays,object,key-value,Javascript,Jquery,Arrays,Object,Key Value,这是我的密码: // My object var fakeArray = { "length": 2, 0: "Addy", 1: "Subtracty" }; // Convert my object to a real array var realArray = $.makeArray( fakeArray ) // Use $.map() to a $.map( realArray, function( val, i ) { alert(val); }); 该警报给出了“Ad

这是我的密码:

// My object
var fakeArray = { "length": 2, 0: "Addy", 1: "Subtracty" };

// Convert my object to a real array
var realArray = $.makeArray( fakeArray )

// Use $.map() to a
$.map( realArray, function( val, i ) {
    alert(val);
});
该警报给出了
“Addy”
“subtract”
,但完全忽略了
“length”:2
键值对。更重要的是,当我交换
“length”时:2

// Swap 2 and "length"
var fakeArray = { 2: "length", 0: "Addy", 1: "Subtracty" };
它只提醒对象(即
[object object]

给出了什么?

因为它应该在类似数组的对象上工作

具有
.length
属性1的对象将从
0
迭代到
length
,并且每个属性值都将推送到结果数组中。非整数键将一致地被忽略

所有其他对象将简单地包装在一个数组中

> $.makeArray({"length": 2, 0: "Addy", 1: "Subtracty"})
["Addy", "Subtracty"]
> $.makeArray({0: "Addy", 1: "Subtracty", 2: "length"})
[{0: "Addy", 1: "Subtracty", 2: "length"}]
1:有关确切定义,请参见,因为它应该用于类似数组的对象

具有
.length
属性1的对象将从
0
迭代到
length
,并且每个属性值都将推送到结果数组中。非整数键将一致地被忽略

所有其他对象将简单地包装在一个数组中

> $.makeArray({"length": 2, 0: "Addy", 1: "Subtracty"})
["Addy", "Subtracty"]
> $.makeArray({0: "Addy", 1: "Subtracty", 2: "length"})
[{0: "Addy", 1: "Subtracty", 2: "length"}]
1:有关确切定义,请参见,因为它应该用于类似数组的对象

具有
.length
属性1的对象将从
0
迭代到
length
,并且每个属性值都将推送到结果数组中。非整数键将一致地被忽略

所有其他对象将简单地包装在一个数组中

> $.makeArray({"length": 2, 0: "Addy", 1: "Subtracty"})
["Addy", "Subtracty"]
> $.makeArray({0: "Addy", 1: "Subtracty", 2: "length"})
[{0: "Addy", 1: "Subtracty", 2: "length"}]
1:有关确切定义,请参见,因为它应该用于类似数组的对象

具有
.length
属性1的对象将从
0
迭代到
length
,并且每个属性值都将推送到结果数组中。非整数键将一致地被忽略

所有其他对象将简单地包装在一个数组中

> $.makeArray({"length": 2, 0: "Addy", 1: "Subtracty"})
["Addy", "Subtracty"]
> $.makeArray({0: "Addy", 1: "Subtracty", 2: "length"})
[{0: "Addy", 1: "Subtracty", 2: "length"}]

1:有关确切定义,请参见

不要使用alert(),使用console.log(),然后检查浏览器的控制台。尝试一下这个,但可能是因为JavaScript没有字符串键所需的关联数组。JavaScript有括号表示法和点表示法,但它们是指对象而不是数组。对于第一种情况,您的
realArray
实际上是一个数组,因此
length
属性变得不可编辑,您不能使用任何类型的循环(甚至
for…in
)使其公开,公开该属性的唯一方法是使用名为
Object.getOwnPropertyNames()
的纯JS方法。对于第二种情况,如果交换2和“length”,那么
伪数组根本不是伪数组,因此无法使用
$将其转换为真实数组。makeArray
,因此整个
伪数组将被放入一个数组中,如
[fakeArray]
,提醒它只显示
[object object]
。谢谢@KingKing我注意到的另一件事是,当我将
“length”:2
更改为
“length”:3
时,它会再次返回
[对象对象]
,这是为什么?@Wilhelm这也是对象成为类似数组的对象的一个条件,
length
应该是数组的项数,您有
0
1
,因此它应该是
length:2
。无论如何,这就是
$的方式。makeArray
理解一个类似数组的对象并将其转换为真实数组。不要使用alert(),使用console.log(),然后检查浏览器的控制台。只是尝试一下这个,但可能是因为JavaScript没有字符串键所具有的关联数组。JavaScript有括号表示法和点表示法,但它们是指对象而不是数组。对于第一种情况,您的
realArray
实际上是一个数组,因此
length
属性变得不可编辑,您不能使用任何类型的循环(甚至
for…in
)使其公开,公开该属性的唯一方法是使用名为
Object.getOwnPropertyNames()
的纯JS方法。对于第二种情况,如果交换2和“length”,那么
伪数组根本不是伪数组,因此无法使用
$将其转换为真实数组。makeArray
,因此整个
伪数组将被放入一个数组中,如
[fakeArray]
,提醒它只显示
[object object]
。谢谢@KingKing我注意到的另一件事是,当我将
“length”:2
更改为
“length”:3
时,它会再次返回
[对象对象]
,这是为什么?@Wilhelm这也是对象成为类似数组的对象的一个条件,
length
应该是数组的项数,您有
0
1
,因此它应该是
length:2
。无论如何,这就是
$的方式。makeArray
理解一个类似数组的对象并将其转换为真实数组。不要使用alert(),使用console.log(),然后检查浏览器的控制台。只是尝试一下这个,但可能是因为JavaScript没有字符串键所具有的关联数组。JavaScript有括号表示法和点表示法,但它们是指对象而不是数组。对于第一种情况,您的
realArray
实际上是一个数组,因此
length
属性变得不可编辑,您不能使用任何类型的循环(甚至
for…in
)使其公开,公开该属性的唯一方法是使用名为
Object.getOwnPropertyNames()
的纯JS方法。对于第二种情况,如果交换2和“length”,那么
伪数组根本不是伪数组,因此无法使用
$将其转换为真实数组。makeArray
,因此整个
伪数组将被放入一个数组中,如
[fakeArray]
,提醒它只显示
[object object]
。谢谢@KingKing我注意到的另一件事是,当我将
“length”:2
更改为
“length”:3
时,它返回
[o