Никаких реальных преимуществ здесь. Также я бы не сказал, что есть большой недостаток, если вы можете справиться с неопределенностью, пока не установите его. Понимание того, как работают типы, особенно в отношении равенства, что происходит, когда вы смешиваете разные типы между одними и теми же операторами и передачей по ссылке и передачей по значению, важнее, чем попытка установить строгую парадигму типизации на динамическом языке.
Теперь, когда вы объявляете литералы объекта, это может избавить вас от хлопот, связанных с предварительным объявлением всех свойств.
Например
myObject.with.way.too.much.hierarchy
Если вы планируете просто добавлять эти свойства по ходу работы, вам нужно будет проверить наличие каждого свойства в этой цепочке в любом сценарии, где вы не можете быть уверены, что все они определены потому что попытка получить доступ к свойству несуществующего объекта, даже если просто проверить, не определено ли оно, вызовет ошибку.
Так что у вас будет что-то непристойное, подобное этому:
if(myObject && myObject.with && myObject.with.way ...//ew
Примечание: лично я склонен объявлять все свои переменные заранее, но скорее как самодокументирующую вещь.