函数调用中的解构赋值,同时保留对象
有没有办法做下面的事情?
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)