Home Reference Source

src/fav-prop.defaults-deep.js

// @fav/[email protected] 有点不符合我的需求
// 1. 判断了 `isPlainObject` 时重新设置了一个对象
// 2. 当 `source` 上的属性值为 `null` 时不设置到 `target` 上面

'use strict';

import enumOwnProps from '@fav/prop.enum-own-props';
import isPlainObject from '@fav/type.is-plain-object';

function defaultsDeep(dest /* , ...src */) {
//   if (!isPlainObject(dest)) {
//     dest = {};
//   }

  for (var i = 1, n = arguments.length; i < n; i++) {
    defaultsDeepEach(dest, arguments[i]);
  }
  return dest;
}

function defaultsDeepEach(dest, src) {
  var props = enumOwnProps(src);
  for (var i = 0, n = props.length; i < n; i++) {
    var prop = props[i];
    var srcProp = src[prop];
    var destProp = dest[prop];

    if (isPlainObject(srcProp)) {
      if (destProp == null) {
        dest[prop] = destProp = {};
      } else if (!isPlainObject(destProp)) {
        continue;
      }
      defaultsDeepEach(destProp, srcProp);
      continue;
    }

    if (destProp != null) {
      continue;
    }

    // if (srcProp == null) {
    //   continue;
    // }

    try {
      dest[prop] = srcProp;
    } catch (e) {
      // If a property is read only, TypeError is thrown,
      // but this function ignore it.
    }
  }
}

export default defaultsDeep;