我有一个对象数组。我需要知道这两行之间的区别:
var clonedObj = _.map(obj, _.clone);
和此:
var clonedObj = _.clone(obj);
最终两者都返回相同的东西。有谁能解释我的区别吗?
答案 0 :(得分:2)
不同之处在于,在_.map
的第一个代码段中,您将_.clone
应用于该数组的每个元素 - 将每个元素映射到新的克隆对象。这意味着对象被逐个浅地克隆,因此它们彼此不相等意味着它们在内存中是不同的对象:
const arr = [
{ foo: 'bar' }
];
console.log(_.map(arr, _.clone)[0] == arr[0]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
另一方面,如果你只克隆数组,它将浅层克隆数组,但数组中的元素保持不变,因此克隆数组中的对象具有相同的引用来自原始阵列:
const arr = [
{ foo: 'bar' }
];
console.log(_.clone(arr)[0] == arr[0]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
在内部,_.clone
方法使用structured clone algorithm中定义的HTML5 specification。
答案 1 :(得分:0)
1)克隆
_.clone(object)
克隆函数用于创建传递的对象的浅表副本。 数组元素被轻微复制,这意味着新数组不会复制数组元素,而是在新克隆的数组中传递或使用对现有元素的引用。
2)地图
_.map(list, iteratee, [context])
通过转换函数(iteratee)映射列表中的每个值,生成一个新的值数组。迭代器传递三个参数:值,然后是迭代的索引(或键),最后是对整个列表的引用。
**var clonedObj = _.map(obj, _.clone);**
_。map创建新的内存位置,其中_.clone函数用于将浅层复制元素复制到新位置。
实际上,obj是在新的内存位置创建的。
**var clonedObj = _.clone(obj);**
在这种情况下,返回浅复制对象意味着传递obj中项目的引用以创建新的克隆对象。 clonedObj中的项目包含对obj。
中项目的引用