下划线中有几行
_.clone = function(obj) {
if (!_.isObject(obj)) return obj;
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};
我不知道为什么这里使用 obj.slice()
来返回 obj(array)。
如果_.isArray(obj)
为true,则返回结果为obj.slice()。
问题
据我所知,不带参数的array.slice
什么也不做。我认为它应该只是 obj
而不是 obj.slice()
。
在这一行中使用obj.slice()
有什么原因吗?
最佳答案
此函数应该克隆某些内容,从而创建一个新数组。如果返回 obj,则根本没有克隆。来自 doc , array.slice()
:
returns a new array containing the extracted elements.
调用 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
关于javascript - 为什么Underscore的clone函数要使用数组切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41182613/