UNPKG

bbo

Version:

bbo is a utility library of zero dependencies for javascript.

57 lines (48 loc) 1.44 kB
'use strict'; 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;