84 lines
1.8 KiB
JavaScript
84 lines
1.8 KiB
JavaScript
/*!
|
|
* shallow-clone <https://github.com/jonschlinkert/shallow-clone>
|
|
*
|
|
* Copyright (c) 2015-present, Jon Schlinkert.
|
|
* Released under the MIT License.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const valueOf = Symbol.prototype.valueOf;
|
|
const typeOf = require('kind-of');
|
|
|
|
function clone(val, deep) {
|
|
switch (typeOf(val)) {
|
|
case 'array':
|
|
return val.slice();
|
|
case 'object':
|
|
return Object.assign({}, val);
|
|
case 'date':
|
|
return new val.constructor(Number(val));
|
|
case 'map':
|
|
return new Map(val);
|
|
case 'set':
|
|
return new Set(val);
|
|
case 'buffer':
|
|
return cloneBuffer(val);
|
|
case 'symbol':
|
|
return cloneSymbol(val);
|
|
case 'arraybuffer':
|
|
return cloneArrayBuffer(val);
|
|
case 'float32array':
|
|
case 'float64array':
|
|
case 'int16array':
|
|
case 'int32array':
|
|
case 'int8array':
|
|
case 'uint16array':
|
|
case 'uint32array':
|
|
case 'uint8clampedarray':
|
|
case 'uint8array':
|
|
return cloneTypedArray(val);
|
|
case 'regexp':
|
|
return cloneRegExp(val);
|
|
case 'error':
|
|
return Object.create(val);
|
|
default: {
|
|
return val;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cloneRegExp(val) {
|
|
const flags = val.flags !== void 0 ? val.flags : (/\w+$/.exec(val) || void 0);
|
|
const re = new val.constructor(val.source, flags);
|
|
re.lastIndex = val.lastIndex;
|
|
return re;
|
|
}
|
|
|
|
function cloneArrayBuffer(val) {
|
|
const res = new val.constructor(val.byteLength);
|
|
new Uint8Array(res).set(new Uint8Array(val));
|
|
return res;
|
|
}
|
|
|
|
function cloneTypedArray(val, deep) {
|
|
return new val.constructor(val.buffer, val.byteOffset, val.length);
|
|
}
|
|
|
|
function cloneBuffer(val) {
|
|
const len = val.length;
|
|
const buf = Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : Buffer.from(len);
|
|
val.copy(buf);
|
|
return buf;
|
|
}
|
|
|
|
function cloneSymbol(val) {
|
|
return valueOf ? Object(valueOf.call(val)) : {};
|
|
}
|
|
|
|
/**
|
|
* Expose `clone`
|
|
*/
|
|
|
|
module.exports = clone;
|