无法理解有关ES6解构的此片段

时间:2016-03-11 16:08:36

标签: javascript ecmascript-6

我正在阅读latest one of You Don't Know JS series并且在进入解构部分时完全迷失了。请帮我理解这里的片段。这里的上下文将使一些指定的配置生效,而其他默认值仍然可用。

默认值:

var defaults = {
    options: {
        remove: true,
        enable: false,
        instance: {}
    },
    log: {
        warn: true,
        error: true
    }
};

配置:

var config = {
    options: {
        remove: false,
        instance: null
    }
};

作者如何完成

config.options = config.options || {};
config.log = config.log || {};
({
    options: {
        remove: config.options.remove = defaults.options.remove,
        enable: config.options.enable = defaults.options.enable,
        instance: config.options.instance =
                      defaults.options.instance
    } = {},
    log: {
        warn: config.log.warn = defaults.log.warn,
        error: config.log.error = defaults.log.error
    } = {}
} = config);

并且作者对该片段做了如下描述:

  

之前的片段方法有效,因为我正在攻击   解构和默认机制来做属性=== undefined   我的检查和作业决定。这是我的一招   destructuring config(参见代码片段末尾的= config),但是   我将所有的结构化值重新分配回配置,   使用config.options.enable赋值引用。

最混乱的一个是最后一句: with config.options.enable赋值引用。 config.options.enable与config.options的其他属性有什么区别?

您能否对我的代码和说明做一些解释?谢谢!

2 个答案:

答案 0 :(得分:7)

这是我的错字。我刚刚提交了一个问题,以便在第二版中解决它。我应该说config.enable.XYZ明确表示我指的是所有这些,而不仅仅是那个。对不起,我的错误让你感到困惑。

答案 1 :(得分:2)

此代码使用解构作为深度合并对象的机制。这很奇怪,不要这样做。

直接回答您的问题:

  

config.options.enable与config.options的其他属性有什么区别?

没有区别。作者正在使用$filename = "files/armaupdates"; $text = $_POST['update']; $updatesep = "<hr><br><hr><br>"; $updatedContents = $text . $updatesep . file_get_contents($filename); $fp = fopen($filename, "a+"); if($fp){ fwrite($fp, $updatedContents); fclose($fp); echo "Updates has been written!"; } else { echo "Error!"; } 来引用所有看起来像config.options.enable的行。