Object.keys vs Object.value - .keys 发生变异而 .value 没有。为什么是这样?
Object.keys vs Object.value - .keys mutates and .value does not. Why is this?
我正在尝试更改 Javascript、Object.values 中对象内的值,而 运行 forEach 循环对我来说似乎最有意义,但 Object.keys (obj[key]) 实际上更新了对象上的值。这是我的代码,可以更好地解释。
下面这种方式按预期工作
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)
这是为什么?两种方式不应该产生相同的结果吗?
此行为与 Object.keys()
和 Object.values()
本身无关。它们都是 return 具有键/值副本的数组,并且不会改变对象本身。
您只是在程序中访问不同的值。在第一个程序中,您实际上是在改变对象本身,在第二个程序中,您只更改作为实际值副本的值。由于它是原始值,因此值的变化不会反映在原始值中。
如果你有,例如一个对象作为一个值,然后 Object.values()
将 return 对该对象的引用的副本,因此(因为引用指向内存中的相同数据)任何更改也将反映在原始数组中.
// now the values are not simple primitive types but an object
const usersValue = { user1: { id: 18273 } , user2: { id: 92833 }, user3: { id: 90315 } }
Object.values(usersValue).forEach((value) => {
value.id = value.id*2
})
// changes are now reflected in the object
console.log(usersValue)
参见 this thread for more information on pass-by-reference 和 pass-by-value。
我正在尝试更改 Javascript、Object.values 中对象内的值,而 运行 forEach 循环对我来说似乎最有意义,但 Object.keys (obj[key]) 实际上更新了对象上的值。这是我的代码,可以更好地解释。
下面这种方式按预期工作
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)
这是为什么?两种方式不应该产生相同的结果吗?
此行为与 Object.keys()
和 Object.values()
本身无关。它们都是 return 具有键/值副本的数组,并且不会改变对象本身。
您只是在程序中访问不同的值。在第一个程序中,您实际上是在改变对象本身,在第二个程序中,您只更改作为实际值副本的值。由于它是原始值,因此值的变化不会反映在原始值中。
如果你有,例如一个对象作为一个值,然后 Object.values()
将 return 对该对象的引用的副本,因此(因为引用指向内存中的相同数据)任何更改也将反映在原始数组中.
// now the values are not simple primitive types but an object
const usersValue = { user1: { id: 18273 } , user2: { id: 92833 }, user3: { id: 90315 } }
Object.values(usersValue).forEach((value) => {
value.id = value.id*2
})
// changes are now reflected in the object
console.log(usersValue)
参见 this thread for more information on pass-by-reference 和 pass-by-value。