_.map和_.clone与数组有什么区别?

时间:2017-06-19 16:23:43

标签: javascript arrays underscore.js lodash

我有一个对象数组。我需要知道这两行之间的区别:

var clonedObj = _.map(obj, _.clone);

和此:

var clonedObj = _.clone(obj);

最终两者都返回相同的东西。有谁能解释我的区别吗?

2 个答案:

答案 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)

使用underscore.js

的官方文档

1)克隆

_.clone(object) 

克隆函数用于创建传递的对象的浅表副本。 数组元素被轻微复制,这意味着新数组不会复制数组元素,而是在新克隆的数组中传递或使用对现有元素的引用。

2)地图

_.map(list, iteratee, [context])

通过转换函数(iteratee)映射列表中的每个值,生成一个新的值数组。迭代器传递三个参数:值,然后是迭代的索引(或键),最后是对整个列表的引用。

                 **var clonedObj = _.map(obj, _.clone);**

_。map创建新的内存位置,其中_.clone函数用于将浅层复制元素复制到新位置。

实际上,obj是在新的内存位置创建的。

                **var clonedObj = _.clone(obj);**

在这种情况下,返回浅复制对象意味着传递obj中项目的引用以创建新的克隆对象。 clonedObj中的项目包含对obj。

中项目的引用

参考:http://underscorejs.org/