{ ...obj1, obj2 } 到底做什么
What does { ...obj1, obj2 } do exactly
假设我们有两个对象:
const state = {
fishes: { /* some obj data */ },
animals: { /* some obj data */ }
const animals = { /* some NEW data */ }
在 Vuex 中有一个方法 replaceState(),根据 documentation 接受一个参数并用该对象替换状态。
下面的结果是什么:
replaceState({ ...state, animals })
更具体地说,{ ...state, animals }
究竟做了什么?
为了提供一些背景信息,我从 问题的答案中提取了这个例子。在那个问题中,用户想用新对象 animals
.
替换状态的 animals
属性
我不确定这是否与 Vuex / Vue.js 相关,还是纯 JS 问题,但无论如何我都会用 vue.js 标记它。
这实际上来自 ECMAScript 2018 的 spread syntax and ECMAScript 2015's object destructuring。
{ ...state, animals }
创建 state
对象的浅表副本,其中包含一个名为 animals
的新 属性(其中包含 animals 对象的值)。
因为你是 Vuex 用户,这符合 immutable update patterns 的规则,即防止 'original' 状态对象被更改或变异。您应该阅读使用不可变模式处理 add/update/delete 等常见操作的方法。
表示Object.assign({}, state, { animals: animals} }
.
它的作用是将state
的所有属性扩展到新对象中——制作一个浅拷贝。原始对象 (state
) 中的所有属性都将被复制到新对象(您传递给 replaceState
的对象)中。这是一个简单的演示:
let obj1 = { obj: "1" };
let obj2 = { ...obj1, obj2: true };
console.log(obj1);
console.log(obj2);
animals
位是 ES6 property shorthand,基本上会这样做:
animals: animals
只是语法更简洁。
假设我们有两个对象:
const state = {
fishes: { /* some obj data */ },
animals: { /* some obj data */ }
const animals = { /* some NEW data */ }
在 Vuex 中有一个方法 replaceState(),根据 documentation 接受一个参数并用该对象替换状态。
下面的结果是什么:
replaceState({ ...state, animals })
更具体地说,{ ...state, animals }
究竟做了什么?
为了提供一些背景信息,我从 animals
.
animals
属性
我不确定这是否与 Vuex / Vue.js 相关,还是纯 JS 问题,但无论如何我都会用 vue.js 标记它。
这实际上来自 ECMAScript 2018 的 spread syntax and ECMAScript 2015's object destructuring。
{ ...state, animals }
创建 state
对象的浅表副本,其中包含一个名为 animals
的新 属性(其中包含 animals 对象的值)。
因为你是 Vuex 用户,这符合 immutable update patterns 的规则,即防止 'original' 状态对象被更改或变异。您应该阅读使用不可变模式处理 add/update/delete 等常见操作的方法。
表示Object.assign({}, state, { animals: animals} }
.
它的作用是将state
的所有属性扩展到新对象中——制作一个浅拷贝。原始对象 (state
) 中的所有属性都将被复制到新对象(您传递给 replaceState
的对象)中。这是一个简单的演示:
let obj1 = { obj: "1" };
let obj2 = { ...obj1, obj2: true };
console.log(obj1);
console.log(obj2);
animals
位是 ES6 property shorthand,基本上会这样做:
animals: animals
只是语法更简洁。