#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 объектов недвижимости? должен ли я написать возражение. собственность все время? теперь я думал о распространении нового объекта прямо внутри данного объекта и, конечно, без его перезаписи