Что заставляет консоль Firebug / Chrome обрабатывать пользовательский объект как массив? - PullRequest
14 голосов
/ 10 февраля 2011

Когда я занимаюсь разработкой в ​​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 Ответ

18 голосов
/ 10 февраля 2011

Вот что делает метод isArray в Firebug: (из источника 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 не распознает в качестве массивов ничего, кроме истинных массивов.

...