是什么让Firebug / Chrome控制台将自定义对象视为数组?

时间:2011-02-09 22:02:00

标签: javascript jquery google-chrome console firebug

当我在jQuery中开发时,我经常发现自己在Chrome / Firebug控制台中输入选择器并查看他们给我的内容。它们总是很好地格式化,就像它们是数组一样:

Chrome's console shows a jQuery selection as an array

我试图找出使控制台将对象视为数组的原因。例如,以下自定义对象不被视为数组:

function ElementWrapper(id) {
    this[0] = document.getElementById(id);
}

Chrome's console shows the object as a normal object

如果我然后添加length属性和splice方法,它会神奇地用作数组,任何具有整数键的属性都被视为数组的成员:

function ElementWrapper(id) {
    this[0] = document.getElementById(id);
    this.length = 1;
    this.splice = Array.prototype.splice;
}

Chrome's console shows the object as if it was an array

基本上我的问题是:是什么决定控制台是否将对象显示为数组?它是否有任何基本原理,或者它是完全随意的“如果一个对象具有这些属性,它必须是一个数组?”如果是这样,决定性的属性是什么?

1 个答案:

答案 0 :(得分:18)

这就是Firebug的isArray方法所做的:(来自Firebug source

if (!obj)
    return false;
else if (isIE && !isFunction(obj) && typeof obj == "object" && isFinite(obj.length) && obj.nodeType != 8)
    return true;
else if (isFinite(obj.length) && isFunction(obj.splice))
    return true;
else if (isFinite(obj.length) && isFunction(obj.callee)) // arguments
    return true;
else if (instanceOf(obj, "HTMLCollection"))
    return true;
else if (instanceOf(obj, "NodeList"))
    return true;
else
    return false;

当然,这些检查都不能确保对象是真正的JavaScript数组,但是它们可以合理地猜测对象是否是伪数组,从而为调试提供方便的类似数组的表示

Chrome可能会也可能不会使用这些相同的检查,Firefox 4中的新Web控制台无法将除真正数组以外的任何内容识别为数组。