É uma atribuição de desestruturação do objeto. Como eu, você pode ter achado surpreendente porque a sintaxe de desestruturação de objeto ES6 se parece, mas NÃO se comporta como a construção literal de objeto.
Ele suporta a forma muito concisa que você encontrou, bem como renomear os campos e argumentos padrão:
Essencialmente, é {oldkeyname: newkeyname = defaultvalue, ...}. ':' NÃO é o separador de chave / valor; '=' é.
Algumas consequências dessa decisão de design de linguagem é que você pode ter que fazer coisas como
; ({a, b} = algum_objeto);
Os parênteses extras evitam que as chaves esquerdas sejam analisadas como um bloco, e o ponto-e-vírgula inicial evita que os parênteses sejam analisados como uma chamada de função para uma função na linha anterior.
Para obter mais informações, consulte:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
Cuidado, os principais erros durante a atribuição da desestruturação do objeto NÃO ocorrem; você acaba com valores "indefinidos", seja um erro de chave ou algum outro erro que foi propagado silenciosamente como "indefinido".
> var {rsienstr: foo, q: bar} = {p:1, q:undefined};
undefined
> foo
undefined
> bar
undefined
>