| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- var objectToString = require('./staticObjectToString')
- var objectEach = require('./objectEach')
- var arrayEach = require('./arrayEach')
- function getCativeCtor (val, args) {
- var Ctor = val.__proto__.constructor
- return args ? new Ctor(args) : new Ctor()
- }
- function handleValueClone (item, isDeep) {
- return isDeep ? copyValue(item, isDeep) : item
- }
- function copyValue (val, isDeep) {
- if (val) {
- switch(objectToString.call(val)) {
- case "[object Object]": {
- var restObj = Object.create(Object.getPrototypeOf(val))
- objectEach(val, function (item, key) {
- restObj[key] = handleValueClone(item, isDeep)
- })
- return restObj
- }
- case "[object Date]":
- case "[object RegExp]": {
- return getCativeCtor(val, val.valueOf())
- }
- case "[object Array]":
- case "[object Arguments]": {
- var restArr = []
- arrayEach(val, function (item) {
- restArr.push(handleValueClone(item, isDeep))
- })
- return restArr
- }
- case "[object Set]": {
- var restSet = getCativeCtor(val)
- restSet.forEach(function (item) {
- restSet.add(handleValueClone(item, isDeep))
- })
- return restSet
- }
- case "[object Map]": {
- var restMap = getCativeCtor(val)
- restMap.forEach(function (item, key) {
- restMap.set(key, handleValueClone(item, isDeep))
- })
- return restMap
- }
- }
- }
- return val
- }
- /**
- * 浅拷贝/深拷贝
- *
- * @param {Object} obj 对象/数组
- * @param {Boolean} deep 是否深拷贝
- * @return {Object}
- */
- function clone (obj, deep) {
- if (obj) {
- return copyValue(obj, deep)
- }
- return obj
- }
- module.exports = clone
|