第一次遇到:
payload = {...payload, manufacturer: state.manufacturers.filter(x => x._id === payload.manufacturer)[0]}
解释,类似Object.assign(target, [source...]), 把payload对象和manufacturer key/value组合起来,成为一个新对象。⚠️只是浅层拷贝(1层)
参看:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax
展开语法(Spread syntax)
可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造字面量对象时, 将对象表达式按key-value的方式展开。(译者注: 字面量一般指 [1, 2, 3]
或者 {name: "mdn"}
这种简洁的构造方式)
语法:
myFunction(...iterableObj); [...iterableObj, '4', ...'hello', 6]; let objClone = { ...obj };
在函数调用时使用展开语法
一般使用: func.apply(thisArg, [argsArray])
函数。
//声明一个函数 function myFunction(x, y, z) {} //声明并赋值一个变量args var args = [0, 1, 2]; myFunction.apply(null. args);
有了spread syntax,则可以简单写:
myFunction(...args);
构造字面量数组时使用展开语法
apply的作用就是为原来的数组a附加一个新的数组b,并且这个新的数组b中的每个元素是作为单独的元素添加到a中的:
var array = ['a', 'b']; var elements = [0, 1, 2]; array.push.apply(array, elements); console.info(array); // 原来的array的值变为: ["a", "b", 0, 1, 2]
Array.concat函数是产生一个新的数组。和使用spread syntax进行数组连接的作用一样。
var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; // 将 arr2 中的元素插入到 arr1 的开头 Array.prototype.unshift.apply(arr1, arr2) //等同于 var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; arr1 = [...arr2, ...arr1]; // arr1 现在为 [3, 4, 5, 0, 1, 2]
构造字面量对象时使用展开语法
var obj1 = { foo: 'bar', x: 42 }; var b = {...obj1} // { foo: 'bar', x: 42 }, ⚠️b和obj1各自指向不同的内存空间。
var c = obj1 // c和obj1是指向相同的内存空间。
效果类似Object.assign()。(但有区别,具体见?的连接)