【问题标题】:Why does jQuery's $.makeArray ignore string keys?为什么 jQuery 的 $.makeArray 忽略字符串键?
【发布时间】:2014-06-03 00:02:40
【问题描述】:

这是我的代码:

// 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""Subtracty",但完全忽略了"length": 2 键值对。更何况当我交换"length": 2

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

它只提醒对象(即[object Object]
什么给了?

【问题讨论】:

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

标签: javascript jquery arrays object key-value


【解决方案1】:

因为$.makeArray 应该适用于类似数组的对象

具有.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:具体定义见isArrayLike

【讨论】:

  • ( length - 1 ) in objisArrayLike 的最终返回中检查什么?
  • 你的对象的1 is a property 长度为2
  • 我明白了。所以,in 本质上是检查索引以确认 object 或 (array) 是否为空?我不知道 JS 有一个 in 操作数。感谢您清除它。
  • 不是所有的索引,只有最后一个。它仍然允许半空的“稀疏”数组(类似对象)。但是,是的,看起来这个测试应该防止空对象(偶然具有length 属性)被识别为类数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2020-11-15
  • 1970-01-01
  • 2016-05-16
相关资源
最近更新 更多