Когда вы присваиваете объект переменной в Javascript (и, действительно, в большинстве похожих языков), эта переменная содержит то, что называется «ссылкой» на этот объект. Обратите внимание, что массивы в JS являются объектами, но примитивные значения, такие как строки и числа, не являются.
Одним из следствий назначения объекта «по ссылке» является то, что любое изменение, которое вы вносите в этот объект, даже если оно выполнено к другой переменной, которая ссылается на тот же объект - «появится» при проверке исходной переменной.
Итак, вы начинаете с
var a=['hello', 4]
и затем делаете
a.push(a)
затем объект (массив), на который a
указывает, был изменен. Теперь у него есть дополнительный элемент в конце - это a
, тот самый массив, о котором мы говорим.
Итак, он рекурсивно расширяется:
a = ['hello', 4, a]
= ['hello', 4, ['hello', 4, a]]
= ['hello', 4, ['hello', 4, ['hello', 4, a]]]
...
И так далее, бесконечно. Это не требует бесконечного количества памяти, потому что третий элемент массива является просто ссылкой на область памяти, которая содержит массив.