Во-первых, они оба работают. У вас есть два разных способа скомпилировать код ES6 в ES5:
({ip, port} = config)
// converted to
((_config = config, ip = _config.ip, port = _config.port, _config));
// and
({name, age} = obj)
// converted to
name = obj.name;
age = obj.age;
Результатом в обоих случаях является то, что переменные установлены на соответствующие значения из объекта.
Разница в том, что транспортер считает, что возвращаемое значение операции присваивания может быть важным в первом случае, но не будет во втором случае. Так что в первом случае вы увидите _config
в конце как возвращаемое значение. На самом деле это не нужно, но транспортер защищает - он сделает все возможное, чтобы функциональность была точно такой же.
Что касается , почему думает, что вам может потребоваться возвращаемое значение в первом случае, это из-за отсутствия точки с запятой после объявления объекта config
.
С добавленной точкой с запятой она работает как положено:
let config = {
ip: 'ip',
port: 'port'
};
({ip, port} = config)
Рабочий пример