Оператор расширения (spread ... operator) в JavaScript: примеры с коллекциями и объектами
В JavaScript оператор расширения (spread operator) - это синтаксический сахар, позволяющий развернуть (spread) коллекцию элементов (массив или объект) в другую коллекцию.
Он позволяет более эффективно работать с массивами, объектами и функциями, позволяет создавать новые коллекции на основе старых, и существенно упрощает код.
Синтаксис оператора расширения в JavaScript
Синтаксис оператора расширения очень простой и понятный:
- для массива:
...array
- для объекта:
...object
Работа с массивами
С помощью оператора расширения мы можем объединить два массива в один, скопировать один массив в другой, добавить новый элемент в массив или использовать его вместо метода apply()
для передачи аргументов в функцию. Рассмотрим несколько примеров:
Объединение двух массивов
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [...arr1, ...arr2];
console.log(arr3); // [1, 2, 3, 4, 5, 6]
Копирование массива
const arr1 = [1, 2, 3];
const arr2 = [...arr1];
console.log(arr2); // [1, 2, 3]
Добавление элемента в массив
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4];
console.log(arr2); // [1, 2, 3, 4]
Использование с функцией
const arr = [1, 2, 3];
function sum(a, b, c) {
return a + b + c;
}
console.log(sum(...arr)); // 6
Работа с объектами
С помощью оператора расширения мы можем добавлять свойства в объект, объединять объекты, а также использовать его для создания копии объекта. Рассмотрим несколько примеров:
Добавление свойства в объект
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 };
console.log(obj2); // { a: 1, b: 2, c: 3 }
Объединение объектов
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 }
Создание копии объекта
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1 };
console.log(obj2); // { a: 1, b: 2}
Примеры оператора расширения для React.js
В React.js спред-оператор используется для передачи пропсов компонентам, для добавления новых данных при мутации и т.д.
Рассмотрим следующий пример:
const user = { name: "John", age: 30 };
const props = { ...user, email: "john@example.com" };
В данном примере мы объединяем объект user
и новое свойство email
, используя спред-оператор. Затем мы передаем полученные props
в компонент UserInfo
:
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:
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
.