当使用下划线函数初始化变量时,最好对数组和_(obj)使用.slice(0).克隆对象

When initializing a variable with an underscore function, is it best to use .slice(0) for arrays and _(obj).clone for objects?

本文关键字:obj 使用 slice 对象 数组 函数 下划线 初始化 变量      更新时间:2023-09-26

标题可能有点令人困惑。

考虑以下下划线文档中的示例:

var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; }); => [1, 3, 5]

找到

注:我加了var oFound = ...

var oFound = _.findWhere(publicServicePulitzers, {newsroom: "The New York Times"});

在拒绝示例中使用.slice(0)和在查找位置示例中使用_(obj).clone()是否被认为是最佳实践?这将确保新初始化的变量不是对下划线函数输入的引用。例如:

var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; }).slice(0);var oFound = _(_.findWhere(publicServicePulitzers, {newsroom: "The New York Times"})).clone();

No。首先,函数不会在任何地方保留它返回给你的值的副本,其次,如果它保留了,它将由函数决定是否返回对它的直接引用或它的副本是合适的。添加sliceclone(除非你有特殊的理由)只会创建没有目的的对象。

请记住,reject返回给您的数组是而不是您输入的数组;它是一个new数组,仅包含未被拒绝的条目。(如果碰巧这些条目中的任何一个是对象引用,那么当然两个数组都有对相同对象的引用。如果你也使用slice,也会是这样。)

另一方面,findWhere的目的是在列表中查找对象,并向您返回对该对象的引用。假定您有访问该对象的理由(可能您想要更改它)。除非你有特别的理由,否则你不仅没有必要复制它,而且它可能会破坏你最初找到它的理由。