函数调用中的解构赋值,同时保留对象

有没有办法做下面的事情?

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 

我想在parsing函数参数中的对象的同时也将对象传递给函数,以便对象可以被修改。

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 } 

arrays – 失败的元素:

 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] 

请注意,上述保留属性的示例将相同的对象放在调用函数时使用的o (或a中的数组)中,而不是拷贝。 要使用浅拷贝,你可以使用下面的例子:

对象 – 保留属性,创build一个新的对象:

 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 } 

数组 – 保存元素,创build一个新的数组:

 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运算符,并且将对象作为函数parameter passing给对象,理论上讲,在实践中可能不会。)

请注意,当调用f({ a: 0, b: 1 })时, ({ a: x, ...o }) => ...只会将{ b: 1 }放入o ,并将0放入x – 就像([x, ...a]) => ...当调用f([0, 1])只会将[1]放入a ,并将x放入x

这意味着使用具有其余参数的解构结构(对于对象和数组而言)不会保留其余variables中的整个数组或对象,而只能保留没有被明确捕获的数据。

这意味着无论您是解构数组还是对象,都需要将显式解构步骤放在函数的主体中,而不是依赖参数语法,如果要使原始数组或对象保持原样。

看到:

  • MDN上的Rest_in_Object_Destructuring

不,这是不可能的,考虑:

 var obj = {a:0} function f (o: {a:x}) {} // not valid - unexpected token : function f ({a}) {} // valid a === 0 function f ({a:x}) {} // valid x === 0, a is undefined - probably no use for this 

ES6实现的最好方法是获得嵌套的道具,而不是对象本身的引用以及嵌套的道具。

(尽pipe这样做会被certificate是错误的,但这也是我期待的一个function)

对于嵌套对象解构,可以使用赋值运算符来提取嵌套的引用值。

 let { o, a = oa } = { o: { a: 'x' } } console.log(o); console.log(a)