Javascript 从变量ES6创建对象

Javascript 从变量ES6创建对象,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我在ES5代码中有一个var,如下所示 var options = { clientId : clientId keepAlive : keepAlive, clean : clean, reconnectPeriod : reconnectPeriod, will : lastWillMessage }; 我可以通过以下方式将此更改为ES6 let options = {clientId,keepAlive,reconnectPeriod,lastWillMessag

我在ES5代码中有一个var,如下所示

  var options = {
  clientId : clientId
  keepAlive : keepAlive,
  clean : clean,
  reconnectPeriod : reconnectPeriod,
  will : lastWillMessage
};
我可以通过以下方式将此更改为ES6

let options = {clientId,keepAlive,reconnectPeriod,lastWillMessage};

但是如果我不想传递所有属性的值,我该怎么做呢?例如,我只想传递clientId和keepAlive。Rest将由MQTT模块设置默认值。那么,如何仅为该对象的某些属性设置值呢

我不确定这是否回答了您的问题,但Object.assign可能会有所帮助:

var options = getOptionsFromMQTT();

Object.assign(options, {options, {clientID, keepAlive});
// options now uses whatever values are assigned to clientID and keepAlive
来自MDN的更多信息:

assign()方法用于将所有可枚举自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象


如果向mqtt.Client传递属性值为undefined的对象,它将使用默认值

function createClient(streamBuilder, clientId, keepAlive, reconnectPeriod, clean, will) {
    let options = {clientId,keepAlive,reconnectPeriod, clean, will};
    mqtt.Client(streamBuilder, options);
}

例如,除了clientId之外,其他每个选项都将使用mqtt的默认值,并在按如下方式调用时保持有效:
createClient(builder'a1',0)
如果您不打算使用某个属性,请忽略它,不要将其作为选项传递。

您的ES6版本会忽略
clean
,并重命名
lastWillMessage
。我想我不理解这个问题……如果MQTT模块会为缺少的参数设置默认值,那么你就不能把它们省略掉吗?你在ES6版本中没有指定clean,所以它当然会被省略。“它”不会“自动”做任何事情。“它”只是按你说的做。如果您告诉它将
clean
放在ES6对象中,那么它会。如果你不这么做,那就不会了。它不知道其他模块需要什么属性,也不知道其他模块将如何处理它们的存在或不存在。您必须阅读MQTT文档才能了解这一点。ES6的缩写在这里为您做的唯一一件事是,如果您省略了属性的值(冒号和后面的任何内容),它使用与属性同名的变量值。听起来您缺少新ES6语法的基本概念……这里唯一相关的新功能是,如果您有一个名为foo的属性和一个名为foo的变量,您可以只编写
foo
而不是
foo:foo
。否则它就像ES5对象文字语法。