Оператор расширения (spread ... operator) в JavaScript: примеры с коллекциями и объектами
JavaScript

Оператор расширения (spread ... operator) в JavaScript: примеры с коллекциями и объектами

Razilator

В JavaScript оператор расширения (spread operator) - это синтаксический сахар, позволяющий развернуть (spread) коллекцию элементов (массив или объект) в другую коллекцию.

Он позволяет более эффективно работать с массивами, объектами и функциями, позволяет создавать новые коллекции на основе старых, и существенно упрощает код.

Синтаксис оператора расширения в JavaScript

Синтаксис оператора расширения очень простой и понятный:

  • для массива: ...array
  • для объекта: ...object

Работа с массивами

С помощью оператора расширения мы можем объединить два массива в один, скопировать один массив в другой, добавить новый элемент в массив или использовать его вместо метода apply() для передачи аргументов в функцию. Рассмотрим несколько примеров:

Объединение двух массивов

index.js
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [...arr1, ...arr2];
console.log(arr3); // [1, 2, 3, 4, 5, 6]

Копирование массива

index.js
const arr1 = [1, 2, 3];
const arr2 = [...arr1];
console.log(arr2); // [1, 2, 3]

Добавление элемента в массив

index.js
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4];
console.log(arr2); // [1, 2, 3, 4]

Использование с функцией

index.js
const arr = [1, 2, 3];
function sum(a, b, c) {
  return a + b + c;
}
console.log(sum(...arr)); // 6

Работа с объектами

С помощью оператора расширения мы можем добавлять свойства в объект, объединять объекты, а также использовать его для создания копии объекта. Рассмотрим несколько примеров:

Добавление свойства в объект

index.js
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 };
console.log(obj2); // { a: 1, b: 2, c: 3 }

Объединение объектов

index.js
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const obj3 = { ...obj1, ...obj2 };
console.log(obj3); // { a: 1, b: 2, c: 3, d: 4 }

Создание копии объекта

index.js
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1 };
console.log(obj2); // { a: 1, b: 2}

Примеры оператора расширения для React.js

В React.js спред-оператор используется для передачи пропсов компонентам, для добавления новых данных при мутации и т.д.

Рассмотрим следующий пример:

index.js
const user = { name: "John", age: 30 };
const props = { ...user, email: "john@example.com" };

В данном примере мы объединяем объект user и новое свойство email, используя спред-оператор. Затем мы передаем полученные props в компонент UserInfo:

components/UI/UserInfo.js
function UserInfo(props) {
  return (
    <div>
      <h2>{props.name}</h2>
      <p>{props.age}</p>
      <p>{props.email}</p>
    </div>
  );
}

ReactDOM.render(<UserInfo {...props} />, document.getElementById("root"));

В результате мы получаем компонент UserInfo с пропсами { name: "John", age: 30, email: "john@example.com" }.

Пример оператора расширения для Next.js

Допустим, у нас есть компонент React в Next.js, который получает данные о статьях через API и хранит их в состоянии articlesData. Мы хотим использовать оператор расширения для добавления новых статей в это состояние при каждом получении новых данных с API.

Вот пример использования оператора расширения ... в Next.js:

components/Articles/ArticleList.js
import React, { useState, useEffect } from "react";
import axios from "axios";

function ArticleList() {
  const [articlesData, setArticlesData] = useState([]);

  useEffect(() => {
    axios
      .get("/api/articles")
      .then((response) => {
        // Добавляем новые статьи к существующим данным
        setArticlesData((prevData) => [...prevData, ...response.data]);
      })
      .catch((error) => {
        console.log(error);
      });
  }, []);

  return (
    <div>
      {articlesData.map((article) => (
        <div key={article.id}>{article.title}</div>
      ))}
    </div>
  );
}

export default ArticleList;

Здесь мы используем useState для хранения массива статей и useEffect для получения новых статей из API. При каждом получении новых данных с API мы используем оператор расширения ... для добавления новых статей к существующим данным в articlesData.

Когда мы обновляем состояние articlesData с помощью setArticlesData, мы используем функцию обновления состояния, которая принимает предыдущее состояние prevData. Мы расширяем prevData с помощью оператора расширения ... и добавляем новые статьи из response.data.

;