Почему console.log (firefox) отображает объект в квадратных скобках?

Я искал многие из существующих тем, но ни один из них не был достаточно конкретным, чтобы точно определить, в чем именно заключаются мои сомнения. Просто для обучения. Я создал функцию-конструктор с единственной целью - использовать ее в качестве цели функции Array (очевидно, для создания массива), а затем использовать ту же функцию, что и «нормальный» конструктор, вместе с ключевым словом «new».

function Myray(val0,val1,val2){ 
this[0] = val0;
this[1] = val1;
this[2] = val2;
}
// Not using the 'new' keyword, but the function Array.
var res = Array.call(Myray, 'one', 'two', 'three');

console.log(res);  -->  Array(3) [ "one", "two", "three" ]
console.log(Array.isArray(res));  //  -->  true

Теперь, используя ключевое слово new, обычно в том же конструкторе, выдает объект, как и ожидалось, но отображается в квадратных скобках как объект массива.

function Myray(val0,val1,val2){ 
this[0] = val0;
this[1] = val1;
this[2] = val2;
}
var res2 = new Myray('one','two','three');
console.log(res2);  -->  Object(3) [ "one", "two", "three" ]

Вопрос, если функция такая же. При вызове функции с помощью Array.call Array заботится только о том, чтобы посмотреть на объект, с которым он вызывается, установить цепочку наследования и создать результирующий тип данных, в данном случае массив. Второй вызов, функция Object, не должен делать то же самое? Почему дисплей в прямых скобках?

«функция-конструктор с единственной целью - использовать ее в качестве цели функции Array» - не работает. Функция конструктора Array полностью игнорирует переданное вами значение this. Ваш вызов эквивалентен var res = Array('one', 'two', 'three');

Bergi 13.09.2018 20:04

Что вы подразумеваете под «прямыми скобками»? Конструктор Array вернет фактический массив, а ваш конструктор вернет новый объект при использовании с new, поэтому вы получаете Array(3) и Object(3).

Derek 朕會功夫 13.09.2018 20:06

«Почему дисплей в прямых скобках?» - это не имеет ничего общего с конструкторами или прототипным наследованием. Консоль может форматировать объект по своему усмотрению, пытаясь выбрать наиболее удобный формат (и каждый браузер делает это по-своему). Я предполагаю, что здесь используются квадратные скобки, потому что у вас есть свойства с целочисленным индексом.

Bergi 13.09.2018 20:07

Вопрос только по дисплею. Спасибо за примечания, но я был уверен, что экземпляры объектов будут отображаться в фигурных скобках {}. Понятия, у меня все в порядке. Спасибо.

LuvMyDog 13.09.2018 20:18

Без ключевого слова new вы создадите переменную массива, а с помощью ключевого слова new вы создадите объект массива

Osama 14.09.2018 16:01

@LuvMyDog: Исторически в javascript всегда были вещи, которые разработчики называли «объектами, подобными массивам». Разработчики браузеров, вероятно, решили отображать их в виде массивов, чтобы облегчить жизнь веб-разработчикам.

slebetman 14.09.2018 17:22
1
6
207
1

Ответы 1

Я пойду с предположением Берги, где консоли браузера могут свободно форматироваться по своему усмотрению, учитывая, что функция-конструктор имеет целочисленные индексированные свойства. Причина в том, что если запускать код в терминале Node.js, он отображает результат в фигурных скобках, что подтверждает мнение Берги. Я должен был сделать это раньше ... Спасибо вам всем.

Это, наверное, тоже историческое. Javascript завален объектами, подобными массивам, от объекта, возвращаемого jQuery, до встроенного списка arguments, до списков узлов, возвращаемых getElementsByClassName. Разработчики браузеров, вероятно, предпочли учитывать объекты, подобные массивам, чтобы облегчить жизнь веб-разработчикам при отладке html-документа.

slebetman 14.09.2018 17:21

«У него зубы крокодила, У него пасть крокодила, Он действует как крокодил, Но это не крокодил ...» Спасибо, слэбетман.

LuvMyDog 15.09.2018 15:07

Другие вопросы по теме