jQuery如何将返回值转换成数组形式?

8
jQuery(); //[]
jQuery("#footer"); //[<div id="footer">...</div>]

我知道你可以做类似这样的事情:

function kablam(tag) {
    var els = document.getElementsByTagName(tag);
    els.isKablam = true;
    return els;
}
var body = kablam("body"); //[<body class="ask-page">...</body>]
body.isKablam; //true

document.getElementsByTagName返回的NodeList,可以返回“扩展”版本。
然而,jQuery却相反。它将结果合并到自身中(可以在这里这里看到)。此外,这并不能解释当你不传任何参数时,它如何返回一个类似数组的对象:
jQuery(); //[]

当您这样做时,jQuery只是返回自身。(来源)
或者同样地,当您选择body标签时:
jQuery("body"); //[<body class="ask-page">...</body>]

(源代码)

或者,想想看,任何事情:

var o = {}, body = document.getElementsByTagName("body");
jQuery.merge(o, body); //Object, not [...]

返回类似数组的对象非常容易,因为分配数字键是微不足道的,与分配任何其他键没有区别。但是,jQuery如何使其“看起来”像一个数组呢?

2个回答

7
你需要在原型上定义.length.splice.push,以便它显示为一个数组。
其他一些数组方法的组合也可能起作用。 示例

1
我非常确定不需要使用.push :) - Benjamin Gruenbaum
1
另外,它不需要在原型上。请在控制台中尝试:a = {length: 0, splice: function() {}} - Shmiddty

0

在你的看法中,“看起来像数组”是什么意思?你如何检查是否为数组?如果你认为所有具有长度的东西都是数组,那么你只需要定义长度属性就可以使对象看起来像数组。jQuery就是这样做的。


这就是为什么我将类似数组和类似数组的区别分开的原因。类似数组被认为具有长度和数字索引(两者都很容易实现)。类似数组的最短答案是,当您记录它时,您会认为您正在查看一个数组。 - Zirak
@bjornd 在这种情况下,“看起来像一个数组”意味着浏览器中的调试器/控制台/开发工具将其打印为数组。 - Raynos
@Zirak,@Raynos,这完全取决于调试器/控制台/开发工具如何处理对象类型。例如,它们可以检查 object instanceof Array 或检查长度或另一个特定于数组的属性。 - bjornd
@bjornd 当你执行 jQuery() 时,结果与普通数组唯一的共同点就是 .length 属性。如果它依赖于调试器或其他什么条件,那么这些条件是什么? - Zirak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接