Es una asignación de desestructuración de objetos. Como yo, puede que le haya resultado sorprendente porque la sintaxis de desestructuración de objetos de ES6 se parece, pero NO se comporta como una construcción literal de objetos.
Admite la forma muy concisa con la que se encontró, además de cambiar el nombre de los campos y los argumentos predeterminados:
Esencialmente, es {oldkeyname: newkeyname = defaultvalue, ...}. ':' NO es el separador clave / valor; '=' es.
Algunas consecuencias de esta decisión de diseño del lenguaje es que es posible que deba hacer cosas como
; ({a, b} = algún_objeto);
Los paréntesis adicionales evitan que las llaves izquierdas se analicen como un bloque, y el punto y coma al principio evita que los paréntesis se analicen como una llamada de función a una función en la línea anterior.
Para obtener más información, consulte:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
Tenga cuidado, los errores clave durante la asignación de desestructuración de objetos NO se lanzan; simplemente termina con valores "indefinidos", ya sea un error clave o algún otro error que se propagó silenciosamente como "indefinido".
> var {rsienstr: foo, q: bar} = {p:1, q:undefined};
undefined
> foo
undefined
> bar
undefined
>