Как Babel переносит оператора покоя / спреда - PullRequest
1 голос
/ 15 октября 2019

Мне было интересно, как Babel передает этот код?

const test = ({ val1, val2, ...rest }) => val1.toLowerCase();

test({
  val1: 'Test',
  val2: 'other',
  o1: 'other',
  o2: 'Another'
});

Это фиктивная функция, которая получает объект в качестве аргумента и возвращает val1 toLowerCase. Так что ничего волшебного.

1 Ответ

2 голосов
/ 15 октября 2019

Это не так сложно. Он создаст массив исключенных свойств, таких как: ['val1', 'val2'], передаст весь объект и исключит массив функции:

var test = function test(_ref) {
var val1 = _ref.val1,
  val2 = _ref.val2,
  rest = _objectWithoutProperties(_ref, ["val1", "val2"]);
  return val1.toLowerCase();
};

Реализация _objectWithoutProperties выглядит следующим образом:

function _objectWithoutProperties(source, excluded) {
  if (source == null) return {};
  // This does the trick
  var target = _objectWithoutPropertiesLoose(source, excluded);

  var key, i;
  // If the object keys were Symbols it will append them too. 
  // If we don't have any symbols this was unnecessary
  if (Object.getOwnPropertySymbols) {
    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
    for (i = 0; i < sourceSymbolKeys.length; i++) {
      key = sourceSymbolKeys[i];
      if (excluded.indexOf(key) >= 0) continue;
      if (
        !Object.prototype.propertyIsEnumerable.call(source, key)
      ) continue;
      target[key] = source[key];
    }
  }
  return target;
}

И, наконец, _objectWithoutPropertiesLoose реализация выглядит так:

function _objectWithoutPropertiesLoose(source, excluded) {
  // if the source object was null so there's nothing to return
  if (source == null) return {};

  // initialize an empty object to assign values to it later 
  var target = {};

  // get an array of keys from the source object and loop through it
  var sourceKeys = Object.keys(source);

  var key, i;
  for (i = 0; i < sourceKeys.length; i++) {
    key = sourceKeys[i];

    // THIS IS WHERE IT HAPPENS: if the current key was present on the excluded array, so skip this iteration
    if (excluded.indexOf(key) >= 0) continue;

    // add the value with that key into the target object
    target[key] = source[key];
  }

  // return the target object
  return target;
}
...