选项感=合并({},选项)语句

时间:2014-11-09 22:27:15

标签: javascript node.js

serve-static npm库的源代码中,我看到了以下行

 options = merge({}, options)

其中merge函数来自utils-merge库,它具有以下正文

exports = module.exports = function(a, b){
  if (a && b) {
    for (var key in b) {
      a[key] = b[key];
    }
  }
  return a;
};

options = merge({}, options)语句有什么意义,因为它只是将options对象与空对象连接起来?

2 个答案:

答案 0 :(得分:1)

merge({}, options)创建与source对象具有相同属性的新对象(因此它是克隆JS对象的最简单方法)。但是如果你没有将空对象作为目标对象传递给合并函数或者只是跳过这一行,options函数内serveStatic()对象的所有更改都会影响传递给函数{{1}的外部对象}}

以下是JavaScript语言细微差别的详细说明:https://stackoverflow.com/a/3638034/1806421

答案 1 :(得分:1)

  

options = merge({}, options)语句有什么意义,因为它只是将options对象与空对象连接起来?

要做到这一点。它将所有属性复制到一个新对象中,即使serveStatic的调用者仍然拥有对其传递的options对象的引用,也无法再修改它们。

但是,避免调用者与对象混淆并不是分离它的唯一原因。如果我们继续阅读,我们会看到像

这样的内容
delete options.setHeaders
options.maxage = options.maxage || options.maxAge || 0
options.root = root

所以我们也想避免弄乱传递给我们的对象。改变你的论点是反模式。