无论Object.assign和对象传播只能做一浅合并.
问题的一个例子:
// No object nesting
const x = { a: 1 }
const y = { b: 1 }
const z = { ...x, ...y } // { a: 1, b: 1 }
Run Code Online (Sandbox Code Playgroud)
输出是你所期望的.但是如果我试试这个:
// Object nesting
const x = { a: { a: 1 } }
const y = { a: { b: 1 } }
const z = { ...x, ...y } // { a: { b: 1 } }
Run Code Online (Sandbox Code Playgroud)
代替
{ a: …Run Code Online (Sandbox Code Playgroud) 在设计状态形状的章节中,文档建议将您的状态保存在由ID键入的对象中:
将每个实体保存在以ID作为密钥存储的对象中,并使用ID从其他实体或列表中引用它.
他们继续陈述
将应用程序的状态视为数据库.
我正在处理状态形状以获取过滤器列表,其中一些将打开(它们显示在弹出窗口中),或者已选择选项.当我读到"将应用程序的状态视为数据库"时,我考虑将它们视为JSON响应,因为它将从API(本身由数据库支持)返回.
所以我一直在考虑它
[{
id: '1',
name: 'View',
open: false,
options: ['10', '11', '12', '13'],
selectedOption: ['10'],
parent: null,
},
{
id: '10',
name: 'Time & Fees',
open: false,
options: ['20', '21', '22', '23', '24'],
selectedOption: null,
parent: '1',
}]
Run Code Online (Sandbox Code Playgroud)
但是,文档建议更像一种格式
{
1: {
name: 'View',
open: false,
options: ['10', '11', '12', '13'],
selectedOption: ['10'],
parent: null,
},
10: {
name: 'Time & Fees',
open: false,
options: ['20', '21', '22', '23', '24'],
selectedOption: null,
parent: …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的Redux项目创建一个深度复制映射方法,该方法将使用对象而不是数组.我读到在Redux中,每个州都不应该改变以前的状态.
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
output[key] = callback.call(this, {...object[key]});
return output;
}, {});
}
Run Code Online (Sandbox Code Playgroud)
有用:
return mapCopy(state, e => {
if (e.id === action.id) {
e.title = 'new item';
}
return e;
})
Run Code Online (Sandbox Code Playgroud)
但是它没有深层复制内部项目所以我需要调整它:
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
let newObject = {...object[key]};
newObject.style = {...newObject.style};
newObject.data = {...newObject.data};
output[key] = callback.call(this, newObject);
return output;
}, {});
}
Run Code Online (Sandbox Code Playgroud)
这不太优雅,因为它需要知道传递了哪些对象.ES6中是否有一种方法可以使用扩展语法来深度复制对象?
我刚刚{....0}在朋友的代码中找到了.在控制台返回中评估它{}(空对象).
这是为什么?JavaScript中4个点的含义是什么?
我使用以下代码来获取唯一的数字:
let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
但是,typescript报告跟随错误:类型"Set"不是数组类型. 我不是打字稿忍者,有人能告诉我这里有什么问题吗?
我对ES2015中的spread语法和rest参数感到困惑.任何人都能用适当的例子来解释它们之间的区别吗?
SpreadElement[Yield]:
...AssignmentExpression[In, ?Yield]
Run Code Online (Sandbox Code Playgroud)
这与Spread语法相同
扩展语法允许在可能需要零个或多个参数(用于函数调用)或元素(用于数组文字)的位置扩展数组表达式或字符串等可迭代的值,或者在零或更多的位置扩展对象表达式键值对(对象文字)是预期的.
句法
对于函数调用:
Run Code Online (Sandbox Code Playgroud)myFunction(...iterableObj);对于数组文字:
Run Code Online (Sandbox Code Playgroud)[...iterableObj, 4, 5, 6]
在MDN文档中描述?
什么是SpreadElement和/或扩展语法的用例; 如果SpreadElement和传播语法不同,它们的具体方式有何不同?
我找到了以下代码,我不知道A和B之间有什么区别:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
Run Code Online (Sandbox Code Playgroud)
一个
fruits.splice(2,0,["Lemon", "Kiwi"]);
Run Code Online (Sandbox Code Playgroud)
乙
fruits.splice(...[2,0].concat(["Lemon", "Kiwi"]));
Run Code Online (Sandbox Code Playgroud)
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var A = fruits.splice(2, 0, ["Lemon", "Kiwi"]);
var B = fruits.splice(...[2, 0].concat(["Lemon", "Kiwi"]));
console.log(A)
console.log(B)Run Code Online (Sandbox Code Playgroud)
我听说...两者都称为"传播语法 "和"传播运算符 ",后者更受欢迎.相关MDN文档的URL 表明它最初被称为扩展运算符,但后来改为扩展语法,MDN的运算符列表没有提到它.
Google似乎认为术语运营商更受欢迎并被接受,其中包括Microsoft文档和es6-features.org等网站.
哪个术语在ECMAScript的上下文中最正确,如果有的话,为什么?数组解构赋值怎么样?
请考虑以下示例代码
var x = ["a", "b", "c"];
var z = ["p", "q"];
var d = [...x, ...z];
var e = x.concat(z);
Run Code Online (Sandbox Code Playgroud)
在这里,价值d和e是完全相同且等于 ["a", "b", "c", "p", "q"],所以,
难道你不认为用正式的广泛语言引入这些小捷径可能会留下一些未被注意的错误,我的意思是要么是非常不必要的,要么我没有意识到它是否需要正确.