Object.keys против Object.value — .keys мутирует, а .value — нет. Почему это?
Я пытаюсь изменить значения внутри объекта в Javascript, Object.values при запуске цикла forEach кажется мне наиболее целесообразным, но Object.keys (obj[ключ]) фактически обновил значение объекта. Вот мой код, чтобы объяснить лучше.
Этот способ ниже работает, как ожидалось
const usersKey = { user1: 18273, user2: 92833, user3: 90315 }
Object.keys(usersKey).forEach((key) => {
usersKey[key] = usersKey[key]*2
})
console.log(usersKey)
Этот способ ниже не обновляет объект
const usersValue = { user1: 18273, user2: 92833, user3: 90315 }
Object.values(usersValue).forEach((value) => {
value = value*2
})
console.log(usersValue)
Почему это? Разве оба способа не должны давать одинаковые результаты?
1 ответ
Такое поведение не имеет ничего общего с
Object.keys()
и как таковой. Оба они возвращают массивы с копиями ключей/значений и не мутируют сам объект.
Вы просто получаете доступ к разным значениям в своих программах. В первой программе вы фактически изменяете сам объект, во второй программе вы изменяете только значение, которое является копией фактического значения. Поскольку это примитивное значение, изменение значения не отражается в исходном значении.
Если бы у вас был, например, объект в качестве значения, то
Object.values()
вернет копию ссылки на этот объект, и поэтому (поскольку ссылка указывает на те же данные в памяти) любое изменение также будет отражено в исходном массиве.
См. этот поток для получения дополнительной информации о передаче по ссылке и передаче по значению.