Что делает панель Firebug/Chrome обрабатывать пользовательский объект как массив?

Когда я разрабатываю 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

Это то, что делает метод Firebug isArray: (из Источник Firebug)

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 не распознает ничего, кроме истинных массивов, как массивы.