代码之家  ›  专栏  ›  技术社区  ›  Neeraj Singh

扩展文件澄清

  •  0
  • Neeraj Singh  · 技术社区  · 16 年前

    以下jquery不会更改默认值或选项的值。返回值与空值相同。空已更改,并用合并数据填充。一切都好。

    var empty = {} 
    var defaults = { validate: false, limit: 5, name: "foo" }; 
    var options = { validate: true, name: "bar" }; 
    $.extend(empty, defaults, options);
    

    然而,我看到有人把真话作为第一选择。

    var defaults = { validate: false, limit: 5, name: "foo" }; 
    var options = { validate: true, name: "bar" };  
    var output = $.extend(true, defaults, options);
    

    在这种情况下,默认值已更改。选项相同,返回值与默认值相同。

    现在试着传递错误。

    var defaults = { validate: false, limit: 5, name: "foo" }; 
    var options = { validate: true, name: "bar" }; 
    var output = $.extend(false, defaults, options);
    

    在这种情况下,默认值和选项不会更改。所以传递真值和

    var defaults = { validate: false, limit: 5, name: "foo" }; 
    var options = { validate: true, name: "bar" }; 
    var output = $.extend(defaults, options);
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   tvanfosson    16 年前

    这是预期的行为。当您将true作为第一个参数传递时,这意味着要进行深度复制,而不是共享对象结构。下一个论点, defaults 当该参数为真时,通过包含可选的布尔深度复制参数成为目标。以下是1.3.2中的相关片段:

    // copy reference to target object
    var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
    
    // Handle a deep copy situation
    if ( typeof target === "boolean" ) {
        deep = target;
        target = arguments[1] || {};
        // skip the boolean and the target
        i = 2;
    }
    

    当您指定false时,您可以看到它隐式地构造了一个新对象,该对象将成为目标。此目标将是以下两个对象的深度副本。

    这记录在 extend 功能。