Ломаем Javascript

Я уже писал статьи про слияние массивов. Показывал много разных способов*. Но один способ показать забыл. Он не столько важен, сколько просто забавен.

Массив — это объект, у которого в качестве ключей — числовые индексы. Поэтому мы в праве написать так:

const a = [ 1, 2 ];
const b = [ 3, 4, 5, 6 ];
const c = Object.assign([], a, b);

Что-то не так. На выходе имеем вывод массива b. Дело в том, что мы перетерли значения массива ‘a’, так как в данном случае идет работа с массивом как с объектом у которого есть пары ключ — значение. Если мы хотим добавить элементы, нам надо будет указывать индексы перезаписываемых элементов:

const a = [ 0, 1, 2 ];
const c = Object.assign([], a, { 3:3, 4:4, 5:5, 6:6 });

Это вообще неудобно. Но зачем может понадобиться нам Object.assign? Не смог пока придумать вменяемого юзкейса. Преимуществ это никаких не дает. Скорее это just for fun =)

Например, можно создать array-like объект:

const c = Object.assign([], { a:'foo', b:'bar' });
console.log( Array.isArray(c) ); // true
c.map((a,b,c) => { // not call
console.log(a,b,c);
});

Таким образом мы получили “сломанный” массив. У нас проходит объект проверку isArray и даже есть метод map, но вот этот самый map не вызывается , потому что length = 0. Но даже если и задать длину:

const c = Object.assign([], { a:'foo', b:'bar', length: 2 });
console.log( c.length ); // 2

Всеравно не получится пройтись по элементам, так как невозможен перебор вида:

for(let i=0;i<a.length;i++) a[i];