【问题标题】:Why does Underscore's clone function use array slice?为什么 Underscore 的克隆函数使用数组切片?
【发布时间】:2016-12-16 10:43:26
【问题描述】:

下划线有线条

  _.clone = function(obj) {
    if (!_.isObject(obj)) return obj;
    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
  };

而且我不知道为什么在这里使用obj.slice() 来返回一个 obj(array)。

如果_.isArray(obj)为真,则返回为obj.slice().

问题

据我所知,array.slice 没有参数什么都不做。我认为应该只是obj 而不是obj.slice()

这行使用obj.slice()有什么原因吗?

【问题讨论】:

    标签: javascript underscore.js clone slice


    【解决方案1】:

    这个函数应该克隆一些东西,从而创建一个新数组。如果您返回obj,则根本没有克隆。来自docarray.slice()

    返回一个包含提取元素的新数组。

    调用slice() 是制作数组副本的一种简单方法。但请注意,此方法只执行浅拷贝(相对于深拷贝):对于嵌套数组(或对象数组),项目将保持相同的地址。这是一个简单的例子:

    var o1 = {"name": "henry"};
    var o2 = {"name": "jean"};
    
    var a1 = [o1, o2];
    var a2 = a1.slice();
    
    a2[0].name = "modified";
    
    console.log(a1[0].name); // --> "modified"
    console.log(a1[0] === a2[0], a1[0] === o1); // --> true
    

    【讨论】:

    • 你是对的。我在回答中添加了这个细节,这可能很有用。
    • 我认为没有使用浅拷贝。我认为结果与使用 obj 而不是 obj.slice() 几乎相同。是否有任何可能的理由复制 obj 浅层?
    猜你喜欢
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多