javascript-在保留对象的同时破坏函数调用中的分配
作者:互联网
这个问题已经在这里有了答案: > ES6 destructuring function parameter – naming root object 3个
有没有办法做下面的事情?
f = (o:{a:x}) {
console.log(o);
console.log(x);
}
f({a:0});
//Should Print:
//{a:0}
//0
为了获得与此相同的结果.
f = function(o) {
var {a:x} = o;
console.log(o);
console.log(x);
}
f({a:0});
//Prints
//{a:0}
//0
我想在函数参数中解构对象,同时还将对象传递给函数,以便可以修改对象.
解决方法:
TL; DR
对象-丢失属性:
let f = ({ a: x, ...o }) => {
console.log(o);
console.log(x);
};
f({ a: 0, b: 1, c: 2 });
// x is: 0
// o is: { b: 1, c: 2 }
对象-保留属性:
let f = (o) => {
let { a: x } = o;
console.log(o);
console.log(x);
};
f({ a: 0, b: 1, c: 2 });
// x is: 0
// o is: { a: 0, b: 1, c: 2 }
数组-丢失元素:
let f = ([x, ...a]) => {
console.log(a);
console.log(x);
};
f([0, 1, 2]);
// x is: 0
// a is: [1, 2]
数组-保留元素:
let f = (a) => {
let [x] = a;
console.log(a);
console.log(x);
};
f([0, 1, 2 ]);
// x is: 0
// a is: [0, 1, 2]
请注意,上面保留属性的示例将在调用函数时使用的同一对象(或数组中的a)(而不是副本)放入了对象.要使用浅表副本,可以使用以下示例:
对象-保留属性,创建一个新对象:
let f = ({ ...o }) => {
let { a: x } = o;
console.log(o);
console.log(x);
};
f({ a: 0, b: 1, c: 2 });
// x is: 0
// o is: { a: 0, b: 1, c: 2 }
数组-保留元素,创建一个新数组:
let f = ([...a]) => {
let [x] = a;
console.log(a);
console.log(x);
};
f([0, 1, 2]);
// x is: 0
// a is: [1, 2]
说明
如果要保留o中原始对象的所有属性,则需要在函数主体中进行显式的分解步骤:let {a:x} = o;但是,如果您只想保留x中未包含的那些属性,则可以使用如下所述的解构(将来在受支持的情况下).有关详细信息,请参见下面的示例.
请注意,我最初假设您要进行结构分解,就像对数组进行结构分解时所得到的那样-但这可能不是您想要的-感谢Karen Grigoryan在评论中指出了这一点.
在逻辑上应该起作用的语法不是这样的:
let f = (o: { a: x }) => {
console.log(o);
console.log(x);
};
但是这个:
let f = ({ a: x, ...o }) => {
console.log(o);
console.log(x);
};
(但是(如果确实能在当今的任何平台上甚至在编译器中使用)它令我(肯定)会感到惊讶.这将需要对rest运算符的支持,以支持对象分解以及将作为函数参数传递的对象的字段解压缩.从理论上讲,没有理由不应该这样做.不起作用.实际上,它可能不会起作用.)
注意({a:x,… o})=> …当以f({a:0,b:1})调用时,将仅将{b:1}放入o并将0放入x-就像([x,… a])=> …当作为f([0,1])调用时,只会在a中放入[1],在x中放入0.
这意味着对对象和数组使用带有剩余参数的解构将不会将整个数组或对象保留在剩余变量中,而只会保留未明确捕获的数据.
这意味着,无论您要对数组或对象进行解构,如果要保留原始的数组或对象,都需要在函数主体中放置显式的解构步骤,而不是依赖于参数语法.
看到:
在MDN上> Rest_in_Object_Destructuring
标签:destructuring,javascript,ecmascript-6,node-js 来源: https://codeday.me/bug/20191010/1886902.html