Почему существует Array.of? AFAIK просто создает массив из переданных аргументов (т.е. Array.of(1,2,3) -> [1,2,3]).
Этот JSPerf показывает, что эта простая функция замены (которая работает точно так же) работает на 80-90% быстрее, чем Array.of
const array_of = (...args) => [...args];
^ это допустимый ES6, а также Array.of
Ну, Array.of делает больше, включая вызов функции-конструктора, которую он предоставляет (обычно, но не всегда Array), установку this и так далее.
@Pointy оператор спреда делает то же самое
@AlexanderNenashev да, это правда, я думал об этом после того, как набрал комментарий. Единственное, что я могу придумать, это то, что Array.of() — это фактическая функция, а не элемент синтаксиса, поэтому в принципе ее можно передать как обратный вызов и т. д.
О, также метод .of() наследуется, поэтому подклассы могут быть значением this, и вы получаете экземпляр подкласса из вызова, чего я не знал до сих пор :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это совершенно нормально. Передача большого количества параметров в функцию и создание ее стекового фрейма — просто затратная операция.
Также, если вы обратитесь к документации, это статический метод Array:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/из
Таким образом, есть дополнительные сценарии его использования, такие как создание подкласса Array, чтобы вы могли создавать экземпляры своего подкласса Array. Это может быть полезно, например, передать его по ссылке в качестве фабрики для вашего подкласса.
Хотя он менее производительный, это может быть не важно для обычных размеров данных, используемых в веб-приложении.
Я также могу сказать, что это из-за того, что Array.of можно использовать в старых браузерах, которые не поддерживают оператор распространения. Это часть ECMAScript 6 (ES6) как встроенный объект. Он более совместим с другими встроенными методами, такими как Array.from и Array.map.
Основная причина этого заключается в том, чтобы предоставить более предсказуемый конструктор, чем традиционный конструктор Array.
Это означает, что когда вы создаете Array(3), он создает пустой массив длиной 3, а не массив с одним элементом, 3. В случае Array.of он всегда создает массив с аргументами, которые вы ему передаете. что хорошо, чтобы не делать неожиданных результатов.
Справедливый вопрос. постараюсь дать на него честный ответ
Мой аргумент в том, что
const arr = Array.of(...args);
более понятен, чем
const arr = (...args) => [...args];
Почему?
В обоих случаях мы создаем новый массив. Это очень важно, потому что массивы обрабатываются по ссылке. Короче говоря: мы все согласны с тем, что приведенный ниже код обновит оба массива.
const x = [ 1, 2, 3 ];
const y = x;
y.push(4);
console.info(x, y);
Оба массива x и y теперь имеют 4 элемента, потому что y является только ссылкой на уже созданный массив x. Любая модификация в y будет относиться к экземпляру, на который ссылаются как x, так и y.
Вот почему, когда мы клонируем сложные типы (не примитивы), мы предполагаем, что новый экземпляр будет отделен и не повлияет на исходное значение. В нашем примере будет сделана следующая модификация, чтобы получить больше исключительных результатов.
const x = [ 1, 2, 3 ];
const y = Array.of(...x);
y.push(4);
console.info(x, y);
Понятно, что y — клон x, по крайней мере для меня, гораздо больше, чем просто
const x = [ 1, 2, 3 ];
const y = (...args) => [...args]; // smae effect, still - are we sure we understand what's going on?
y.push(4);
console.info(x, y);
Мой вопрос: зачем останавливаться здесь? Что, если нам нужно вместо этого клонировать объект?
Хотя некоторые утверждают, что это крутой способ сделать это
const x = { hello: 'world' };
const y = { ...food };
Я думаю, что классический способ более читабелен
const x = { hello: 'world' };
const y = Object.assign({}, x);
Вам не нужно быть мастером javascript, чтобы понять это
Также стоит отметить, что в обоих случаях вы можете сделать клон, используя
const x = { something: 'else', with: [ { 'way': 'more' }, levels: [ 1, 2, 3 ] ] };
const y = JSON.parse(JSON.stringify(x));
Это очень простой способ (или грязный хак) для сериализации и дестерилизации объекта, создания его идеального клона.
Когда производительность имеет значение, производительность команды также имеет решающее значение. Скорее всего, они поймут, а также оценят более производительный код (и, вероятно, будут злиться всякий раз, когда сталкиваются с циклом forEach).
В любом другом случае сделайте так, чтобы другие люди могли легко поддерживать вашу кодовую базу.
Ваше здоровье
Есть итерируемые вещи, которые не являются массивами, и
Array.of()позволяет их конвертировать.