为什么Underscore的克隆功能使用数组切片?

时间:2016-12-16 10:43:26

标签: javascript underscore.js clone slice

Underscore中有一些行

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

我不知道为什么obj.slice()在这里用来返回一个obj(数组)。

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

问题

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

这行中是否有obj.slice()使用的原因?

1 个答案:

答案 0 :(得分:4)

此功能应克隆某些内容,从而创建新数组。如果您返回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