Pull to refresh

Comments 20

Spread оператор работает с последовательностями, а не с псевдомассивами. Ему свойство length не требуется, ему Symbol.iterator нужен.


И да, замена прототипа псевдомассив настоящим массивом не сделает, хоть и даст нужные методы. Это можно заметить если к такому "массиву" применить функцию Array.isArray или JSON.stringify

Добавил вторую заметку в статью.
Лично мне кажется что не совсем корректно выбрано название. Почему какой-то псевдомассив, а не хеш? Ведь массив подразумевает числовые значения в качестве ключей, а хеш строковой. И мне почему-то кажется что в js объекты могут только строки в качестве ключей использовать.
И если считать, что псевдомассив, это каждый объект имеющий свойство length, то было бы проще сказать, что в js все объекты псевдомассивы, так как они все унаследованы от Object, у которого есть свойство length.
Простите, но я не соглашусь. Не у всех производных Object есть стандартное свойство length. Псевдомассив потому, что в объекте в качестве ключей используется числовые значения, но объект не является массивом. И я сказал, что JavaScript может преобразовать любой объект в массив, если тот соответствует условию из статьи.
А у каких производных от Object типов нет свойства length? А как Вы узнаете что в качестве ключа используется именно число?
К примеру, у того же Element. А зачем мне это узнавать? Я проверю присутствие свойства length и то что значение в нём >= 0. Если всё подойдёт, то объект может быть псевдомассивом.

У большинства нет такого свойства.

Ноги у "псеводомассивов" растут из первой версии языка, в которой собственно массивов не было, а DOM-интерфейс содержал списки элементов.
Хэш-таблица это просто один из способов организации словаря и собственно называть так любую key-value структуру особо смысла нет — внутри может быть хэш-таблица, а может и не быть.

Если псевдомассиву не нужны все функции от Array.prototype, их с call использовать не обязательно.
Можно вместо этого сначала переписать их в псевдомассив.
myPseudoArray.each = Array.prototype.forEach;
myPseudoArray.sort = Array.prototype.sort;

myPseudoArray.sort( coolSortFun ).each( myLog );


Но опять же, не в продакшене. На Тостере мне уже говорили, что это ай-я-яй.
как вариант, в добавок к методам можно Object.entries() использовать
К сожалению, это экспериментальная технология. Может в будущем…

В списке есть Map, но он не подходит под определение


То есть у него есть числовые свойства (индексы) и свойство length.

т.к. length всегда равен '1' и индекс могут быть любыми.
Да и перечисленные методы с ним корректно работать не будут.

Простите, но подходит. Если вы преобразуете его, даже без числовых индексов, то получится массив [undefined]

Наличие индексов не спасает.


Array.prototype.slice.call(new Map([[0, "value1"], [1, "value2"]])) // > []

В данном случае должно присутствовать свойство length, равное размеру псевдомассива. А его нет.

Простите, но вы, насколько я знаю, у вас просто создаётся объект {0: 'value1', 1: 'value1'}, который не является псевдомассивом… вы его ни в одной функции массивов не сможете использовать
не является псевдомассивом

Я вам и пишу, что Map (который вы перечислили в статье) не подходит на роль псевдомассива. Или вы о каком-то другом Map?

О нём. Интересно конечно. Я внося в список ориентировался документацией, в которой было написано, что это массив. Удалил из списка

Э… но где в документации было написано что это массив?

Объективно №3 самый универсальный способ и стоит его придерживаться.

Sign up to leave a comment.

Articles