1 | var objectToString = require('./staticObjectToString')
|
2 |
|
3 | var isArray = require('./isArray')
|
4 | var objectEach = require('./objectEach')
|
5 | var arrayEach = require('./arrayEach')
|
6 |
|
7 | function getCtorObject (val, args) {
|
8 | var Ctor = val.__proto__.constructor
|
9 | return args ? new Ctor(args) : new Ctor()
|
10 | }
|
11 |
|
12 | function handleValueClone (item, isDeep) {
|
13 | return isDeep ? copyValue(item, isDeep) : item
|
14 | }
|
15 |
|
16 | function 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 |
|
61 |
|
62 |
|
63 |
|
64 | function clone (obj, deep) {
|
65 | if (obj) {
|
66 | return copyValue(obj, deep)
|
67 | }
|
68 | return obj
|
69 | }
|
70 |
|
71 | module.exports = clone
|