({a = 1, b = 1, c = 1} = something) => {}
просто означает, что something
должен быть объектом или может быть преобразован в один, то есть это не может быть null
или undefined
. 1
Итак, в случае 0
он перехватывает свойства a
, b
и c
0
, то есть (0).a
, (0).b
, (0).c
, все undefined
, следовательно, все они по умолчанию равны 1
, их предоставленное значение по умолчанию.
0
можно, конечно, привести к объекту Number
. Вот почему вы можете сделать (0).toString()
или {toString} = 0
. Именно это и происходит здесь.
Как правило, это не эквивалентно использованию {}
по умолчанию, поскольку при этом будут использоваться свойства пустого объекта (как собственные свойства, так и свойства в цепочке прототипов), а не свойства числа.
1: Наиболее сокращенная форма этой «структурной проверки» - ({} = something)
. Для деструктурирования массивов это ([] = something)
, и это означает, что something
также должно быть повторяемым . Кстати, эти пустые назначения деструктурирования не создают никаких переменных, они просто выполняют проверку структуры.