c и d указывают на один массив. После d.push(d) оба вывода показывают массив длины 4, последний элемент которого ссылается на него самого.
Что будет выведено в консоль в данном JavaScript‑фрагменте?
c и d указывают на один массив. После d.push(d) оба вывода показывают массив длины 4, последний элемент которого ссылается на него самого.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой вывод появится в консоли после выполнения следующего кода.
var c = [1, 2, 3]
var d = c
d.push(d)
console.log(c) // ?
console.log(d)
Ответ
c и d указывают на один массив. После d.push(d) оба вывода показывают массив длины 4, последний элемент которого ссылается на него самого.
Изначально присваивание d = c копирует ссылку, а не массив. Затем в общий массив добавляется эта же ссылка. Поэтому c === d и c[3] === c равны true. Консоль может обозначать последний элемент как circular reference; точное оформление зависит от среды. Это не бесконечная вложенная копия, а циклическая структура. Обычный JSON.stringify(c) выбросит TypeError из-за цикла.