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?