Как вернуть новый объект из функции без глубокого копирования - PullRequest
0 голосов
/ 25 марта 2019

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

Но когда я это делаю, это становится одинаковой ссылкой на оба объекта, и одинаковые изменения влияют на оба.

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

Например, см. Код. Х и у одинаковы, когда я назначаю их из func1 , но когда я использую func2 , каждый из них является другим.

Я пытаюсь избавить от необходимости выполнять глубокое копирование объекта с помощью 3-х инструментов или вручную, с помощью собственной сервисной функции.

Есть ли простое решение этой проблемы, и я буду рад узнать, чему научиться, понять это.

Спасибо.

let obj1 = {
    a:"Ay", 
    b: "Bi"
}

function func1(){

    return obj1;
}


let x = func1 ();
let y = func1();
console.log(x , y);
x.a = "new value1 ";
console.log(x , y);
//both x & y changed


function func2(){
    let obj2 = {
    a:"Ay", 
    b: "Bi"
}
    return obj2;
}


x = func2 ();
y = func2();
console.log(x , y);
x.a = "other value1 ";
console.log(x , y);
//only x have changed

1 Ответ

1 голос
/ 25 марта 2019

Объекты передаются по ссылке в Javascript, который вы можете использовать Spread Operator для создания клонов

let obj1 = {
	a:"Ay", 
	b: "Bi"
}

function func1() {
	return {...obj1};
}


let x = func1 ();
let y = func1();
console.log(y);
x.a = "new value1 ";
console.log(x , y);


function func2(){
	return {
	a:"Ay", 
	b: "Bi"
}
}


x = func2 ();
y = func2();
console.log(x , y);
x.a = "other value1 ";
console.log(x , y);

Существуют и другие способы создания копии объектов. Ниже приведен быстрый тест https://jsperf.com/deep-copy-vs-json-stringify-json-parse/5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...