使用下划线函数初始化变量时,最好对数组使用 .slice(0),对 objects 使用 _(obj).clone 吗?

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

标题可能有点混乱。

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

Reject

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

Find Where

注意:我添加了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();

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

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

另一方面,findWhere 的目的是在列表中找到对象 并且 return 向您提供对该对象的引用.大概您有理由想要访问该对象(也许您想更改它)。除非你有特定的理由这样做,否则不仅没有必要复制它,而且它可能会主动破坏你首先找到它的理由。