функциональное программирование javascript Мутация внешней зависимости

#javascript #functional-programming

Вопрос:

Может ли кто-нибудь объяснить такое поведение javascript?

 let a = {z: true};
console.log(a);
const modify = obj => {
  let b = {
    a: "hello",
    b: 22
  }
  obj = {...obj, ...b}
  return obj;
}
modify(a);
console.log(modify(a))
 

выход:

 {
  z:true,
  a:"hello",
  b:22
}
 

является ли obj в obj = {...obj, ...b} неявно новом созданном объекте или это тот же obj параметр modify .
потому что, когда я пытаюсь прокомментировать return obj; строку ( //return obj; ) в текстовом редакторе visual studio, параметр obj внутри modify функции кажется исчезнувшим, что означает, что я не использую его внутри функции. Также без необходимости return obj; я просто хотел изменить данный объект и привязать к нему некоторые новые свойства. возможно ли это?

Комментарии:

1. Этот вопрос должен многое рассказать об объектах. Вы должны понимать типы javascript (примитивный и ссылочный тип), а также проверить, как spread работает оператор для объединения двух объектов. Короче говоря, если вы передаете объект функции и изменяете его внутри этой функции, то вы изменяете переданный объект и, следовательно return , в этом нет необходимости. Кроме того, ваш функциональный подход неверен, потому что в функциональном программировании у вас не должно быть побочных эффектов, и вы делаете это, это не чистая функция. На данный момент это все.

2. @TheAlpha да, ты прав. мы не должны называть это функциональным подходом :XD

Ответ №1:

Объект в вашем коде не мутирует. Буквальное обозначение объекта (с { } ) всегда создает объект. Во-вторых, назначение obj -это локальная переменная с таким именем, а не переменная вызывающего ( a ). Чтобы изменить данный объект, вы можете использовать Object.assign :

 let a = {z: true};
console.log(a);
const modify = obj => {
  let b = {
    a: "hello",
    b: 22
  }
  // The return is not absolutely necessary...
  return Object.assign(obj, b);
}
modify(a);
console.log(a); 

Конечно, когда вы позволяете функциям изменять объекты, вы больше не соответствуете принципам функционального программирования.

Ответ №2:

obj = {...obj, ...b} создаст новый объект. Если вы хотите изменить данный объект, просто измените его свойства:

    const modify = obj => {
       obj.a = "hello"
       obj.b = 22
    }
 

Если вы хотите объединить новый объект с существующим объектом, вы также можете использовать Object.assign :

Object.assign(obj, b)

Комментарии:

1. Я нахожу это довольно явным созданием объекта.

2. @arielhad что, если бы у меня было 50 объектов недвижимости? должен ли я написать возражение. собственность все время? теперь я думал о распространении нового объекта прямо внутри данного объекта и, конечно, без его перезаписи