Что делает объект jQuery отображаться как массив в инструментах разработчика Chrome?

Мне интересно, как возможно, что объекты jQuery отображаются в виде массива в консольном журнале инструментов разработчика в Chrome.

например. если я выполняю $('<a>'), то, что я вижу в журнале консоли:

[<a>​</a>​]

Но следующие утверждения ложны:

var a = $("<a>");

Array.isArray(a);   // false
a instanceof Array; // false

Я попытался изменить jQuery и посмотреть, что происходит, и удивительно то, что удаление length из функции jQuery удаляет нотацию массива:

length: 0, // commenting this line removes array notation

Вместо этого он отображается как (стрелка является сплошной, чтобы развернуть):

> jQuery.jQuery.fn.jQuery.init

Но если я попытаюсь создать свой собственный конструктор, который должен отображаться в нотации массива, он не работает:

var test = function() { this.length = 0 };

new test();

// Logged (arrow is same one as before):
// > test

Итак, мне интересно, что в коде jQuery разработчики демонстрируют экземпляры как массив. Какое свойство/функция/вещь добавляется в jQuery, что делает инструменты разработчика обрабатывать его как массив при отображении экземпляра?

Ответ 1

От http://api.jquery.com/jQuery.makeArray/:

Многие методы, как в jQuery, так и в JavaScript в целом, возвращают объекты, похожие на массивы. Например, функция jQuery factory $() возвращает объект jQuery, который обладает многими свойствами массива (длина, оператор доступа к массиву [] и т.д.), Но не является точно таким же, как массив и не хватает некоторых встроенных методов массива (таких как .pop() и .reverse()).

В принципе, объект должен иметь свойства length и splice, которые должны быть похожими на массив. Вот соответствующий вопрос SO: Array Like Objects в Javascript

Ответ 2

Вы, вероятно, знаете это, но console.log не отображает переданный контент "как есть", он пытается быть "умным" и выполняет некоторую пост-обработку. Если вы хотите увидеть исходный объект "как есть", существует метод console.dir.