我一直在我正在处理的代码库中看到类似这样的函数:
const func = ({ param1, param2 }) => {
//do stuff
}
这究竟是在做什么?我很难在谷歌上找到它,因为我什至不确定这叫什么,或者如何在谷歌搜索中描述它。
我一直在我正在处理的代码库中看到类似这样的函数:
const func = ({ param1, param2 }) => {
//do stuff
}
这究竟是在做什么?我很难在谷歌上找到它,因为我什至不确定这叫什么,或者如何在谷歌搜索中描述它。
它正在解构,但包含在参数中。没有解构的等价物是:
const func = o => {
var param1 = o.param1;
var param2 = o.param2;
//do stuff
}
这是将对象作为属性传递。
它基本上是简写
let param1 = someObject.param1
let param2 = someObject.param2
使用这种不带参数的技术的另一种方法如下,让我们考虑一下 someObject 确实包含这些属性。
let {param1, param2} = someObject;
它是一个对象解构赋值。像我一样,您可能会感到惊讶,因为 ES6 对象解构语法看起来很像,但行为却不像对象字面量构造。
它支持您遇到的非常简洁的形式,以及重命名字段和默认参数:
本质上,它是 {oldkeyname:newkeyname=defaultvalue,...}。':' 不是键/值分隔符;'=' 是。
这种语言设计决定的一些后果是你可能不得不做这样的事情
;({a,b}=some_object);
额外的括号防止左花括号被解析为块,前导分号防止括号被解析为对前一行函数的函数调用。
有关更多信息,请参阅:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
请注意,对象解构赋值期间的关键错误不会抛出;您最终会得到“未定义”值,无论是关键错误还是其他一些作为“未定义”静默传播的错误。
> var {rsienstr: foo, q: bar} = {p:1, q:undefined};
undefined
> foo
undefined
> bar
undefined
>