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()вернет копию ссылки на этот объект, и поэтому (поскольку ссылка указывает на те же данные в памяти) любое изменение также будет отражено в исходном массиве.

См. этот поток для получения дополнительной информации о передаче по ссылке и передаче по значению.

Другие вопросы по тегам