Spec-Zone.ru › Web APIs

Метод Window: structuredClone()

Базовая версия Широко доступна

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с марта 2022 года.

  • Узнать больше
  • Полная совместимость
  • Отправить отзыв

Метод structuredClone() интерфейса Window создаёт глубокую копию заданного значения с использованием алгоритма структурированного клонирования.

Метод также позволяет передавать (а не клонировать) передаваемые объекты в исходном значении в новый объект. Переданные объекты отсоединяются от исходного объекта и присоединяются к новому; они больше недоступны в исходном объекте.

Синтаксис

structuredClone(value)
structuredClone(value, options)

Параметры

value

Объект, который нужно клонировать. Это может быть любой тип, поддерживающий структурное клонирование.

options Необязательно

Объект со следующими свойствами:

transfer

Массив передаваемых объектов, которые будут перемещены, а не скопированы в возвращаемый объект.

Возвращаемое значение

Глубокая копия исходного value.

Исключения

DataCloneError DOMException

Выбрасывается, если какая-либо часть входного значения не может быть сериализована.

Описание

Эта функция может использоваться для создания глубокой копии значений JavaScript. Она также поддерживает циклические ссылки, как показано ниже:

// Create an object with a value and a circular reference to itself.
const original = { name: "MDN" };
original.itself = original;

// Clone it
const clone = structuredClone(original);

console.assert(clone !== original); // the objects are not the same (not same identity)
console.assert(clone.name === "MDN"); // they do have the same values
console.assert(clone.itself === clone); // and the circular reference is preserved

Передача значений

Передаваемые объекты (только) могут быть переданы, а не дублированы в клонированном объекте, используя свойство transfer параметра options. Передача делает исходный объект непригодным для использования.

Примечание: Сценарий, где это может быть полезно, — асинхронная проверка данных в буфере перед сохранением. Чтобы избежать изменения буфера до сохранения данных, вы можете создать копию буфера и проверить эти данные. Если вы также передадите данные, любые попытки изменить исходный буфер завершатся ошибкой, предотвратив его случайное использование.

Следующий код демонстрирует, как клонировать массив и передать его базовые ресурсы в новый объект. После возврата исходный uInt8Array.buffer будет очищен.

// 16MB = 1024 * 1024 * 16
const uInt8Array = Uint8Array.from({ length: 1024 * 1024 * 16 }, (v, i) => i);

const transferred = structuredClone(uInt8Array, {
  transfer: [uInt8Array.buffer],
});
console.log(uInt8Array.byteLength); // 0

Вы можете клонировать любое количество объектов и передать любой подмножество этих объектов. Например, следующий код передаст arrayBuffer1, но не arrayBuffer2 из переданного значения.

const transferred = structuredClone(
  { x: { y: { z: arrayBuffer1, w: arrayBuffer2 } } },
  { transfer: [arrayBuffer1] },
);

Примеры

Клонирование объекта

В этом примере мы клонируем объект с одним элементом — массивом. После клонирования изменения в каждом объекте не влияют на другой объект.

const mushrooms1 = {
  amanita: ["muscaria", "virosa"],
};

const mushrooms2 = structuredClone(mushrooms1);

mushrooms2.amanita.push("pantherina");
mushrooms1.amanita.pop();

console.log(mushrooms2.amanita); // ["muscaria", "virosa", "pantherina"]
console.log(mushrooms1.amanita); // ["muscaria"]

Передача объекта

В этом примере мы создаём ArrayBuffer, а затем клонируем объект, в котором он находится, передавая буфер. Мы можем использовать буфер в клонированном объекте, но если мы попытаемся использовать исходный буфер, произойдёт исключение.

// Create an ArrayBuffer with a size in bytes
const buffer1 = new ArrayBuffer(16);

const object1 = {
  buffer: buffer1,
};

// Clone the object containing the buffer, and transfer it
const object2 = structuredClone(object1, { transfer: [buffer1] });

// Create an array from the cloned buffer
const int32View2 = new Int32Array(object2.buffer);
int32View2[0] = 42;
console.log(int32View2[0]);

// Creating an array from the original buffer throws a TypeError
const int32View1 = new Int32Array(object1.buffer);

Спецификации

Спецификация
HTML
# dom-structuredclone

Совместимость с браузерами

Рабочие столы Мобильные устройства
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android
structuredClone 98 98 94 84 15.4 98 94 68 15.4 18.0 98

См. также

  • Полифил structuredClone доступен в core-js
  • Алгоритм структурного клонирования
  • Полифил структурного клонирования

© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API