Почему существует Array.of?

Почему существует 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() позволяет их конвертировать.

Pointy 28.06.2023 19:16

Ну, Array.of делает больше, включая вызов функции-конструктора, которую он предоставляет (обычно, но не всегда Array), установку this и так далее.

Scott Sauyet 28.06.2023 19:16

@Pointy оператор спреда делает то же самое

Alexander Nenashev 28.06.2023 19:26

@AlexanderNenashev да, это правда, я думал об этом после того, как набрал комментарий. Единственное, что я могу придумать, это то, что Array.of() — это фактическая функция, а не элемент синтаксиса, поэтому в принципе ее можно передать как обратный вызов и т. д.

Pointy 28.06.2023 19:29

О, также метод .of() наследуется, поэтому подклассы могут быть значением this, и вы получаете экземпляр подкласса из вызова, чего я не знал до сих пор :)

Pointy 28.06.2023 19:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это совершенно нормально. Передача большого количества параметров в функцию и создание ее стекового фрейма — просто затратная операция.

Также, если вы обратитесь к документации, это статический метод 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).

В любом другом случае сделайте так, чтобы другие люди могли легко поддерживать вашу кодовую базу.

Ваше здоровье

Другие вопросы по теме