【问题标题】:What makes Firebug/Chrome console treat a custom object as an array?是什么让 Firebug/Chrome 控制台将自定义对象视为数组?
【发布时间】:2011-06-24 11:26:23
【问题描述】:

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

我正在尝试弄清楚是什么使控制台将对象视为数组。例如,以下自定义对象不被视为数组:

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

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

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

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

【问题讨论】:

    标签: javascript jquery google-chrome console firebug


    【解决方案1】:

    这就是 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 控制台不会将除真正数组之外的任何内容识别为数组。

    【讨论】:

    • 那么对于一个jquery的选择结果,哪一个是真的呢?
    • 前几天我错过了这个。不错的答案。 +1
    • Chrome 使用相同的 firebug 检测: // FireBug 的数组检测。 if (isFinite(obj.length) && typeof obj.splice === "function") return "array"; if (isFinite(obj.length) && typeof obj.callee === "function") // 参数。返回“数组”;
    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 2012-03-10
    • 1970-01-01
    • 2012-07-30
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多