bbo
Version:
bbo is a utility library of zero dependencies for javascript.
57 lines (48 loc) • 1.44 kB
JavaScript
;
require('./get_tag.js');
var is_array = require('./is_array.js');
var is_function = require('./is_function.js');
/* eslint-disable eqeqeq */
function clone(obj) {
// var arr = [1, 2, 3];
// var subObj = { aa: 1 };
// var obj = { a: 3, b: 5, c: arr, d: subObj };
// var objClone = bbo.clone(obj);
// arr.push(4);
// subObj.bb = 2;
// obj; // {a: 3, b: 5, c: [1, 2, 3, 4], d: {aa: 1}}
// objClone; // {a: 3, b: 5, c: [1, 2, 3], d: {aa: 1, bb: 2}}
if (is_function(obj)) {
return obj;
}
var result = is_array(obj) ? [] : {};
for (var key in obj) {
// include prototype properties
var value = obj[key];
var type = {}.toString.call(value).slice(8, -1);
if (type == 'Array' || type == 'Object') {
result[key] = clone(value);
} else if (type == 'Date') {
result[key] = new Date(value.getTime());
} else if (type == 'RegExp') {
result[key] = RegExp(value.source, getRegExpFlags(value));
} else {
result[key] = value;
}
}
return result;
}
function getRegExpFlags(regExp) {
if (typeof regExp.source.flags == 'string') {
return regExp.source.flags;
} else {
var flags = [];
regExp.global && flags.push('g');
regExp.ignoreCase && flags.push('i');
regExp.multiline && flags.push('m');
regExp.sticky && flags.push('y');
regExp.unicode && flags.push('u');
return flags.join('');
}
}
module.exports = clone;