UNPKG

1.81 kBJavaScriptView Raw
1var objectToString = require('./staticObjectToString')
2
3var isArray = require('./isArray')
4var objectEach = require('./objectEach')
5var arrayEach = require('./arrayEach')
6
7function getCtorObject (val, args) {
8 var Ctor = val.__proto__.constructor
9 return args ? new Ctor(args) : new Ctor()
10}
11
12function handleValueClone (item, isDeep) {
13 return isDeep ? copyValue(item, isDeep) : item
14}
15
16function copyValue (val, isDeep) {
17 if (val) {
18 switch(objectToString.call(val)) {
19 case "[object Object]":
20 case "[object Arguments]": {
21 var restObj = getCtorObject(val)
22 objectEach(val, function (item, key) {
23 restObj[key] = handleValueClone(item, isDeep)
24 })
25 return restObj
26 }
27 case "[object Date]":
28 case "[object RegExp]": {
29 return getCtorObject(val, val.valueOf())
30 }
31 case "[object Array]": {
32 var restArr = []
33 arrayEach(val, function (item) {
34 restArr.push(handleValueClone(item, isDeep))
35 })
36 return restArr
37 }
38 case "[object Set]": {
39 var restSet = getCtorObject(val)
40 restSet.forEach(function (item) {
41 restSet.add(handleValueClone(item, isDeep))
42 })
43 return restSet
44 }
45 case "[object Map]": {
46 var restMap = getCtorObject(val)
47 restMap.forEach(function (item, key) {
48 restMap.set(handleValueClone(item, isDeep))
49 })
50 return restMap
51 }
52 }
53 }
54 return val
55}
56
57/**
58 * 浅拷贝/深拷贝
59 *
60 * @param {Object} obj 对象/数组
61 * @param {Boolean} deep 是否深拷贝
62 * @return {Object}
63 */
64function clone (obj, deep) {
65 if (obj) {
66 return copyValue(obj, deep)
67 }
68 return obj
69}
70
71module.exports = clone