Это назначение деструктуризации объекта. Как и я, вы, возможно, нашли это удивительным, потому что синтаксис деструктуризации объекта ES6 выглядит, но НЕ ведет себя как построение литерала объекта.
Он поддерживает очень сжатую форму, с которой вы столкнулись, а также переименование полей и аргументов по умолчанию:
По сути, это {oldkeyname: newkeyname = defaultvalue, ...}. ':' НЕ является разделителем ключа / значения; '=' есть.
Некоторым следствием этого решения о языковом дизайне является то, что вам, возможно, придется делать такие вещи, как
; ({a, b} = некоторый_объект);
Дополнительные скобки препятствуют синтаксическому анализу левых фигурных скобок как блока, а начальная точка с запятой препятствует синтаксическому анализу скобок как вызову функции в предыдущей строке.
Для получения дополнительной информации см.
Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment.
Осторожно, ключевые ошибки при назначении деструктуризации объекта НЕ генерируются; вы просто получаете значения «undefined», будь то ключевая ошибка или какая-то другая ошибка, которая молча передается как «undefined».
> var {rsienstr: foo, q: bar} = {p:1, q:undefined};
undefined
> foo
undefined
> bar
undefined
>