Бесконечность как параметр?

1

Я читал исходный код библиотеки Underscore и наткнулся на это:

  _.iteratee = builtinIteratee = function(value, context) {
    return cb(value, context, Infinity);
  };

Что значит иметь Infinity в качестве параметра?

Редактировать:

Извините, вот cb и optimizeCb. Они преобразуют обратные вызовы в соответствующие итерации.

  var optimizeCb = function(func, context, argCount) {
    if (context === void 0) return func;
    switch (argCount) {
      case 1: return function(value) {
        return func.call(context, value);
      };
      // The 2-parameter case has been omitted only because no current consumers
      // made use of it.
      case null:
      case 3: return function(value, index, collection) {
        return func.call(context, value, index, collection);
      };
      case 4: return function(accumulator, value, index, collection) {
        return func.call(context, accumulator, value, index, collection);
      };
    }
    return function() {
      return func.apply(context, arguments);
    };
  };

  // An internal function to generate callbacks that can be applied to each
  // element in a collection, returning the desired result — either 'identity',
  // an arbitrary callback, a property matcher, or a property accessor.
  var cb = function(value, context, argCount) {
    if (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
    if (value == null) return _.identity;
    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
    if (_.isObject(value) && !_.isArray(value)) return _.matcher(value);
    return _.property(value);
  };
  • 1
    Зависит от того, что делает cb() ?
  • 1
    это означает, что любой cb (который вы не показали) будет вызываться с третьим аргументом, являющимся Infinity ... независимо от того, что cb (я уже говорил, вы не показывали этого) делает с Infinity все, что ему нужно делать с Infinity
Показать ещё 1 комментарий
Теги:
underscore.js

2 ответа

1
Лучший ответ

Infinity интерпретируется как число. В этом случае источник приводит сюда:

  // Internal function that returns an efficient (for current engines) version
  // of the passed-in callback, to be repeatedly applied in other Underscore
  // functions.
  var optimizeCb = function(func, context, argCount) {
    if (context === void 0) return func;
    switch (argCount == null ? 3 : argCount) {
      case 1: return function(value) {
        return func.call(context, value);
      };
      // The 2-argument case is omitted because were not using it.
      case 3: return function(value, index, collection) {
        return func.call(context, value, index, collection);
      };
      case 4: return function(accumulator, value, index, collection) {
        return func.call(context, accumulator, value, index, collection);
      };
    }
    return function() {
      return func.apply(context, arguments);
    };
  };

Обратите внимание, что Infinity передается параметру argCount. Оператор switch/case завершает работу и возвращает функцию, которая просто применит контекст и аргументы к функции обратного вызова. Использование Infinity похоже, обеспечивает провал.

  • 0
    Ах, большое спасибо. Таким образом, в основном говорится, что персонализированные итераторы учитывают любые параметры, которые хотят пользователи. Поэтому я предполагаю, что пользователь просто удаляет s builtInIteratee из присваивания, и теперь этот пользователь настраивается.
1

Это означает, что параметр больше всех остальных чисел для всех целей и целей:

Из MDN:

Начальное значение Infinity - Number.POSITIVE_INFINITY. Значение Infinity (положительная бесконечность) больше любого другого числа. Математически это значение ведет себя так же, как бесконечность; например, любое положительное число, умноженное на бесконечность, равно бесконечности, а любое число, деленное на бесконечность, равно 0.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню