Javascript 为什么下划线';s克隆函数是否使用数组切片?

Javascript 为什么下划线';s克隆函数是否使用数组切片?,javascript,underscore.js,clone,slice,Javascript,Underscore.js,Clone,Slice,下划线中有几行 _.clone = function(obj) { if (!_.isObject(obj)) return obj; return _.isArray(obj) ? obj.slice() : _.extend({}, obj); }; 我不知道为什么这里使用obj.slice()来返回obj(数组) 如果\uu.isArray(obj)为true,则返回值变为obj.slice() 问题: 据我所知,没有参数的array.slice没有任何作用。我认

下划线中有几行

  _.clone = function(obj) {
    if (!_.isObject(obj)) return obj;
    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
  };
我不知道为什么这里使用
obj.slice()
来返回obj(数组)

如果
\uu.isArray(obj)
为true,则返回值变为
obj.slice()

问题: 据我所知,没有参数的
array.slice
没有任何作用。我认为应该是
obj
而不是
obj.slice()


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

此函数应该克隆某些内容,从而创建一个新数组。如果返回
obj
,则根本没有克隆。从,
array.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
,则根本没有克隆。从,
array.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?你是对的。我在回答中补充了这个细节,这可能会有用。我认为肤浅的复制是没有用的。我认为使用obj而不是obj.slice()的结果几乎相同。是否有任何可能的理由复制obj shallow?