【问题标题】:ES6 destructuring object, default value on assignment when not used as a function parameter?ES6解构对象,不用作函数参数时赋值的默认值?
【发布时间】:2015-10-04 19:55:59
【问题描述】:

我有:

const fs = require('fs');

const packageConfig = JSON.parse(fs.readFileSync('./package.json'));
const { jspm: { configFile: jspmConfigFile }} = packageConfig;

packageConfigconfigFile 值可能未定义。在这种情况下,我想默认jspmConfigFile'config.js

是否可以在不创建扩展 packageConfig 对象的情况下做到这一点?

我意识到我可以这样做:

const { jspm: { configFile: jspmConfigFile }} = _.extend({
    jspm: { config: 'config.js'}
}, packageConfig);

但这只是为了获得一个合理的解构默认值。

我错过了什么?

【问题讨论】:

  • const jspmConfigFile = packageConfig.jspm.configFile || 'config.js'; 怎么样?
  • 嗯,我想过这个问题,但我试图了解更多关于解构的知识 + 利用我可以安全地访问嵌套属性而无需检查父属性是否存在这一事实。

标签: javascript ecmascript-6 destructuring


【解决方案1】:

对象解构中默认值的语法是:

const { jspm: { configFile: jspmConfigFile = 'config.js' }} = packageConfig;

但这还没有在 Firefox 中实现:https://bugzilla.mozilla.org/show_bug.cgi?id=932080

【讨论】:

  • 没问题。嗨@SeanAnderson!
【解决方案2】:

我不确定 ES2015 解构是否真的能在这里买到任何东西。归根结底,因为您只是在解构单个元素。您几乎正在编写一种奇特的方式:

const jspmConfigFile = packageConfig.jspm.configFile;

您可以在最里面的部分使用= 'defaultValue' 指定一个默认值,但我不相信这实际上比它的ES5 || 'default' 版本更好。

附带说明,您可以在 Node 中 require JSON 文件:

const jspmConfigFile = require("./package.json").jspm.configFile || "default";

是一种我认为更短的班轮。你也可以直接在一个衬里import它:

import  { jspm: { configFile: jspmConfigFile = 'config.js' }} from "./package.json"

但老实说,我不认为这更清楚。

【讨论】:

  • 嗯,它确实让我不必检查“jspm”是否未定义而不会出错。
  • @SeanAnderson 是的,但是 IMO 解构单个嵌套属性通常会产生令人困惑的代码。我已经考虑过是否要添加这个答案,并决定在 Rob 添加他的答案以提供“ES2015”方式的替代方案时添加它:)
  • 是的,这当然是一个有效的论点。我认为在看到生成的代码后,我会坚持使用旧方法,但我很高兴我至少检查了其他方法。
  • @SeanAnderson 为什么你认为不用检查jspm 是否定义就可以使用它? ({ jspm: { configFile: jspmConfigFile }} = {}); 在 Firefox 41.0 中抛出“TypeError: can't convert undefined to object”。
  • 哦。我以为这是福利?显然对 ES6 来说还是超级新的。好吧,我看不出在这种情况下使用它有什么意义!
猜你喜欢
  • 2016-10-30
  • 2017-04-01
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多