function isKey(value, object) {
  var type = typeof value;
  if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {
    return true;
  }
  if (isArray(value)) {
    return false;
  }
  var result = !reIsDeepProp.test(value);
  return result || (object != null && value in toObject(object));
}
Merges the function metadata of `source` into `data`.

Merging metadata reduces the number of wrappers required to invoke a function.
This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`
augment function arguments, making the order in which they are executed important,
preventing the merging of metadata. However, we make an exception for a safe
common case where curried functions have `_.ary` and or `_.rearg` applied.

@private
@param {Array} data The destination metadata.
@param {Array} source The source metadata.
@returns {Array} Returns `data`.