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