传递参数'guard'在underscore.js函数中检查什么?

时间:2013-09-05 15:08:40

标签: javascript underscore.js

  

获取数组的第一个元素。传递n将返回第一个N.   数组中的值。别名为头并采取。警卫检查允许   它适用于_.map。

  _.first = _.head = _.take = function(array, n, guard) {
    if (array == null) return void 0;
    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
  };

在这个underscore.js函数中使用变量'guard'有什么用?

1 个答案:

答案 0 :(得分:3)

如果你看一下源代码:

  // Get the first element of an array. Passing **n** will return the first N
  // values in the array. Aliased as `head` and `take`. The **guard** check
  // allows it to work with `_.map`.
  _.first = _.head = _.take = function(array, n, guard) {
    if (array == null) return void 0;
    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
  };
  

后卫检查允许它与_.map一起使用。

所以如果你有这样的数组:

var a = [ [1, 2, 3], [4, 5, 6] ];
// put this array though _.map and _.first
_.map(a, _.first); // [1, 4]

如果不是这种情况,您的结果将如下所示:

[ [], [4] ]

由于参数进入_.map

_.map(['a', 'b', 'c'], function(val, key, obj) {
    // key = 0, 1, 2
    // val = a, b, c
    // obj = ['a', 'b', 'c'] 
    // the obj argument is why `guard` is truly and the first element in the array is returned rater than using [].slice
});

它不漂亮,但它允许它一起工作:

_.first([1, 2, 3], 2) // [1, 2]
_.first([1, 2, 3], 2, true) // 1
_.first([1, 2, 3], 2, 3) // 1