node-v8-clone
Advanced tools
Comparing version 0.3.0 to 0.4.0
@@ -1,15 +0,8 @@ | ||
var Benchmark = require('benchmark'); | ||
var assert = require('assert'); | ||
try { lodash = require('lodash'); } catch (e) {}; | ||
try { _ = require('underscore'); } catch (e) {}; | ||
try { owl = require('owl-deepcopy'); } catch(e) { console.warn('owl-deepcopy module is not installed'); }; | ||
// array of 5 numeric elements | ||
arr1 = [1, 2, 3, 4, 5]; | ||
shared = require('./shared.js'); | ||
// array of 1000 numeric elements | ||
arr2 = []; | ||
for (var i = 0; i < 1000; i++) { | ||
arr2.push(i); | ||
} | ||
// node-v8-clone js | ||
@@ -19,44 +12,42 @@ var Cloner = require('..').Cloner; | ||
// slice | ||
slice = function(a) { return a.slice(); }; | ||
// array 'for (var i = 0; i < l; i++)' cloner | ||
arr_for = function(arr) { var result = []; for (var i = 0, l = arr.length; i < l; i++) result.push(arr[i]); return result; } | ||
assert.deepEqual(arr1, arr_for(arr1)); | ||
arr_for1 = function(a) { var b = []; for (var i = 0, l = a.length; i < l; i++) b.push(a[i]); return b; } | ||
// array 'for (var i = 0; i < l; i++)' cloner | ||
arr_for2 = function(a) { var b = []; for (var i = 0, l = a.length; i < l; i++) b[i] = a[i]; return b; } | ||
// array 'for (var i = 0; i < l; i++)' cloner 2 | ||
arr_for2 = function(arr) { var l = arr.length, result = new Array(l); for (var i = 0; i < l; i++) result[i] = arr[i]; return result; } | ||
assert.deepEqual(arr1, arr_for2(arr1)); | ||
arr_for3 = function(a) { var l = a.length, b = new Array(l); for (var i = 0; i < l; i++) b[i] = a[i]; return b; } | ||
// array 'for (var i = 0; i < l; i++)' cloner 3 | ||
arr_for4 = function(a) { var l = a.length, b = new Array(); for (var i = 0; i < l; i++) b[i] = a[i]; return b; } | ||
// array 'for (i in arr)' cloner | ||
arr_for_in = function(arr) { var result = []; for(var i in arr) result.push(arr[i]); return result; } | ||
assert.deepEqual(arr1, arr_for_in(arr1)); | ||
arr_for_in = function(a) { var b = []; for(var i in a) b.push(a[i]); return b; } | ||
// array 'for (i in arr) if (hasOwnProperty)' cloner | ||
arr_for_in_has = function(arr) { var result = []; for(var i in arr) if (arr.hasOwnProperty(i)) result.push(arr[i]); return result; } | ||
assert.deepEqual(arr1, arr_for_in_has(arr1)); | ||
arr_for_in_has = function(a) { var b = []; for(var i in a) if (a.hasOwnProperty(i)) b.push(a[i]); return b; } | ||
var suite = new Benchmark.Suite; | ||
suite.on('cycle', function(event) { | ||
console.log(String(event.target)); | ||
// hybrid | ||
hybrid = function(a) { return (a.length > 100) ? a.slice() : arr_for3(a); }; | ||
['arr1', 'arr2', 'arr3', 'arr4', 'arr5', 'arr6'].forEach(function(obj) { | ||
global[obj] = shared[obj]; | ||
shared.benchmark(obj, [ | ||
['slice', 'slice(' + obj + ')'], | ||
['[] for i++ push', 'arr_for1(' + obj + ')'], | ||
['[] for i++ b[i] = a[i]', 'arr_for2(' + obj + ')'], | ||
['Array(l) for i++ b[i] = a[i]', 'arr_for3(' + obj + ')'], | ||
//['Array() ++', 'arr_for4(' + obj + ')'], // same as "[] for i++ b[i] = a[i]" | ||
//['hybrid', 'hybrid(' + obj + ')'], | ||
['for in', 'arr_for_in(' + obj + ')'], | ||
['for in hasOwnProperty', 'arr_for_in_has(' + obj + ')'], | ||
['lodash.clone', 'lodash.clone(' + obj + ', false)'], | ||
['_.clone', '_.clone(' + obj + ')'], | ||
['owl.copy', 'owl.copy(' + obj + ')'], | ||
['node-v8-clone', 'cloner.clone(' + obj + ')'] | ||
]); | ||
}); | ||
suite.on('complete', function() { | ||
console.log('Fastest is ' + this.filter('fastest').pluck('name')); | ||
}); | ||
suite.add('arr1 slice() ', 'arr1.slice()'); | ||
suite.add('arr1 [] for i < l i++ ', 'arr_for(arr1)'); | ||
suite.add('arr1 Array(l) for i < l i++ ', 'arr_for2(arr1)'); | ||
suite.add('arr1 for in ', 'arr_for_in(arr1)'); | ||
suite.add('arr1 for in hasOwnProperty ', 'arr_for_in_has(arr1)'); | ||
suite.add('arr1 lodash.clone ', 'lodash.clone(arr1, false)'); | ||
suite.add('arr1 _.clone ', '_.clone(arr1)'); | ||
suite.add('arr1 node-v8-clone cloner ', 'cloner.clone(arr1)'); | ||
suite.add('arr2 slice() ', 'arr2.slice()'); | ||
suite.add('arr2 [] for i < l i++ ', 'arr_for(arr2)'); | ||
suite.add('arr2 Array(l) for i < l i++ ', 'arr_for2(arr2)'); | ||
suite.add('arr2 for in ', 'arr_for_in(arr2)'); | ||
suite.add('arr2 for in hasOwnProperty ', 'arr_for_in_has(arr2)'); | ||
suite.add('arr2 lodash.clone ', 'lodash.clone(arr2, false)'); | ||
suite.add('arr2 _.clone ', '_.clone(arr2)'); | ||
suite.add('arr2 node-v8-clone cloner ', 'cloner.clone(arr2)'); | ||
suite.run({ 'async': true }); |
@@ -1,7 +0,8 @@ | ||
var Benchmark = require('benchmark'); | ||
var assert = require('assert'); | ||
try { _ = require('lodash'); } catch (e) {}; | ||
try { lodash = require('lodash'); } catch (e) {}; | ||
try { _ = require('underscore'); } catch (e) {}; | ||
try { owl = require('owl-deepcopy'); } catch(e) { console.warn('owl-deepcopy module is not installed'); }; | ||
// Date | ||
date = new Date; | ||
var shared = require('./shared.js'); | ||
@@ -11,20 +12,19 @@ // node-v8-clone | ||
cloner = new Cloner(false); | ||
assert.deepEqual(date, cloner.clone(date)); | ||
// date 'new Date(+date)' cloner | ||
date_clone1 = function(date) { return new Date(+date); }; | ||
// date 'new Date(date)' cloner | ||
date_clone = function(date) { return new Date(+date); } | ||
assert.deepEqual(date, date_clone(date)); | ||
date_clone2 = function(date) { return new Date(date); }; | ||
var suite = new Benchmark.Suite; | ||
suite.on('cycle', function(event) { | ||
console.log(String(event.target)); | ||
['date'].forEach(function(obj) { | ||
global[obj] = shared[obj]; | ||
shared.benchmark(obj, [ | ||
['new Date(+date)', 'date_clone1(' + obj + ')'], | ||
['new Date(date)', 'date_clone2(' + obj + ')'], | ||
['_.clone', '_.clone(' + obj + ')'], | ||
['lodash.clone', 'lodash.clone(' + obj + ', false)'], | ||
['owl.copy', 'owl.copy(' + obj + ')'], | ||
['node-v8-clone', 'cloner.clone(' + obj + ')'] | ||
]); | ||
}); | ||
suite.on('complete', function() { | ||
console.log('Fastest is ' + this.filter('fastest').pluck('name')); | ||
}); | ||
suite.add('date new Date(+date) cloner', 'date_clone(date)'); | ||
suite.add('date lodash _.clone ', '_.clone(date, false)'); | ||
suite.add('date node-v8-clone cloner ', 'cloner.clone(date)'); | ||
suite.run({ 'async': true }); |
@@ -1,22 +0,9 @@ | ||
var Benchmark = require('benchmark'); | ||
var assert = require('assert'); | ||
try { _ = require('lodash'); } catch (e) { console.warn('lodash module is not installed'); }; | ||
try { lodash = require('lodash'); } catch (e) { console.warn('lodash module is not installed'); }; | ||
try { clone = require('clone'); } catch(e) { console.warn('clone module is not installed'); }; | ||
try { cloneextend = require('cloneextend'); } catch(e) { console.warn('cloneextend module is not installed'); }; | ||
try { owl = require('owl-deepcopy'); } catch(e) { console.warn('owl-deepcopy module is not installed'); }; | ||
// deeparr1: 5 string keys and values | ||
deeparr1 = ['a', ['b', 'c', 'd'], 'e']; | ||
var shared = require('./shared.js'); | ||
// deeparr2: 1000 x 1 x 3 x 3 nested elements with string values | ||
deeparr2 = []; | ||
for (var i = 0; i < 1000; i++) { | ||
deeparr2[i] = [ | ||
[ | ||
['c', 'd', 'e'], | ||
['g', 'h', 'i'], | ||
['k', 'l', 'm'] | ||
] | ||
]; | ||
} | ||
// node-v8-clone | ||
@@ -28,24 +15,12 @@ var Cloner = require('..').Cloner; | ||
var suite = new Benchmark.Suite; | ||
suite.on('cycle', function(event) { | ||
console.log(String(event.target)); | ||
['deeparr1', 'deeparr2', 'deepplainarr1', 'deepplainarr2', 'deepplainarr3', 'deepplainarr4', 'deepplainarr5', 'deepplainarr6'].forEach(function(obj) { | ||
global[obj] = shared[obj]; | ||
shared.benchmark(obj, [ | ||
['lodash.clone', 'lodash.clone(' + obj + ', true)'], | ||
['clone', 'clone(' + obj + ')'], | ||
['cloneextend', 'cloneextend.clone(' + obj + ')'], | ||
['owl.deepCopy', 'owl.deepCopy(' + obj + ')'], | ||
['node-v8-clone', 'cloner1.clone(' + obj + ')'], | ||
['node-v8-clone opt', 'cloner2.clone(' + obj + ')'] | ||
]); | ||
}); | ||
suite.on('complete', function() { | ||
console.log('Fastest is ' + this.filter('fastest').pluck('name')); | ||
}); | ||
suite.add('deeparr1 lodash _.clone ', '_.clone(deeparr1, true)'); | ||
suite.add('deeparr1 clone ', 'clone(deeparr1)'); | ||
suite.add('deeparr1 cloneextend.clone ', 'cloneextend.clone(deeparr1)'); | ||
suite.add('deeparr1 cloner1 ', 'cloner1.clone(deeparr1)'); | ||
suite.add('deeparr1 cloner2 ', 'cloner2.clone(deeparr1)'); | ||
suite.add('deeparr1 cloner3 ', 'cloner3.clone(deeparr1)'); | ||
suite.add('deeparr2 lodash _.clone ', '_.clone(deeparr2, true)'); | ||
suite.add('deeparr2 clone ', 'clone(deeparr2)'); | ||
suite.add('deeparr2 cloneextend.clone ', 'cloneextend.clone(deeparr2)'); | ||
suite.add('deeparr2 cloner1 ', 'cloner1.clone(deeparr2)'); | ||
suite.add('deeparr2 cloner2 ', 'cloner2.clone(deeparr2)'); | ||
suite.add('deeparr2 cloner3 ', 'cloner3.clone(deeparr2)'); | ||
suite.run({ 'async': true }); |
@@ -1,37 +0,9 @@ | ||
var Benchmark = require('benchmark'); | ||
var assert = require('assert'); | ||
try { _ = require('lodash'); } catch (e) { console.warn('lodash module is not installed'); }; | ||
try { lodash = require('lodash'); } catch (e) { console.warn('lodash module is not installed'); }; | ||
try { clone = require('clone'); } catch(e) { console.warn('clone module is not installed'); }; | ||
try { cloneextend = require('cloneextend'); } catch(e) { console.warn('cloneextend module is not installed'); }; | ||
try { owl = require('owl-deepcopy'); } catch(e) { console.warn('owl-deepcopy module is not installed'); }; | ||
// deep1: 5 sting keys and values | ||
deep1 = {a: 'a', b: {c: 'c', d: 'd', e: 'e'}, f: 'f'}; | ||
var shared = require('./shared.js'); | ||
// deep2: 5 integer keys and values | ||
deep2 = {1: 1, 2: {3: 3, 4: 4, 5: 5}, 6: 6}; | ||
// deep3: 1000 x 1 x 3 x 3 objects with string keys and values | ||
deep3 = {}; | ||
for (var i = 0; i < 1000; i++) { | ||
deep3['_' + i] = { | ||
a: { | ||
b: {c: 'c', d: 'd', e: 'e'}, | ||
f: {g: 'g', h: 'h', i: 'i'}, | ||
j: {k: 'k', l: 'l', m: 'm'} | ||
} | ||
}; | ||
} | ||
// deep4: 1000 x 1 x 3 x 3 objects with int keys and values | ||
deep4 = {}; | ||
for (var i = 0; i < 1000; i++) { | ||
deep4[i] = { | ||
1: { | ||
2: {3: 3, 4: 4, 5: 5}, | ||
6: {7: 7, 8: 8, 9: 9}, | ||
10: {11: 11, 12: 12, 13: 13} | ||
} | ||
}; | ||
} | ||
// cloner | ||
@@ -41,30 +13,11 @@ var Cloner = require('..').Cloner; | ||
var suite = new Benchmark.Suite; | ||
suite.on('cycle', function(event) { | ||
console.log(String(event.target)); | ||
['deepobj1', 'deepobj2', 'deepobj3', 'deepobj4', 'mixed1', 'mixed2', 'mixed3', 'mixed4'].forEach(function(obj) { | ||
global[obj] = shared[obj]; | ||
shared.benchmark(obj, [ | ||
['lodash.clone', 'lodash.clone(' + obj + ', true)'], | ||
['clone', 'clone(' + obj + ')'], | ||
['cloneextend', 'cloneextend.clone(' + obj + ')'], | ||
['owl.deepCopy', 'owl.deepCopy(' + obj + ')'], | ||
['node-v8-clone', 'cloner.clone(' + obj + ')'] | ||
]); | ||
}); | ||
suite.on('complete', function() { | ||
console.log('Fastest is ' + this.filter('fastest').pluck('name')); | ||
}); | ||
suite.add('deep1 lodash _.clone ', '_.clone(deep1, true)'); | ||
suite.add('deep1 clone ', 'clone(deep1)'); | ||
suite.add('deep1 cloneextend.clone ', 'cloneextend.clone(deep1)'); | ||
suite.add('deep1 node-v8-clone cloner ', 'cloner.clone(deep1)'); | ||
suite.add('deep2 lodash _.clone ', '_.clone(deep2, true)'); | ||
suite.add('deep2 clone ', 'clone(deep2)'); | ||
suite.add('deep2 cloneextend.clone ', 'cloneextend.clone(deep2)'); | ||
suite.add('deep2 node-v8-clone cloner ', 'cloner.clone(deep2)'); | ||
suite.add('deep3 lodash _.clone ', '_.clone(deep3, true)'); | ||
suite.add('deep3 clone ', 'clone(deep3)'); | ||
suite.add('deep3 cloneextend.clone ', 'cloneextend.clone(deep3)'); | ||
suite.add('deep3 node-v8-clone cloner ', 'cloner.clone(deep3)'); | ||
suite.add('deep4 lodash _.clone ', '_.clone(deep4, true)'); | ||
suite.add('deep4 clone ', 'clone(deep4)'); | ||
suite.add('deep4 cloneextend.clone ', 'cloneextend.clone(deep4)'); | ||
suite.add('deep4 node-v8-clone cloner ', 'cloner.clone(deep4)'); | ||
suite.run({ 'async': true }); |
@@ -1,100 +0,31 @@ | ||
var Benchmark = require('benchmark'); | ||
var assert = require('assert'); | ||
try { lodash = require('lodash'); } catch (e) {}; | ||
try { _ = require('underscore'); } catch (e) {}; | ||
try { owl = require('owl-deepcopy'); } catch(e) { console.warn('owl-deepcopy module is not installed'); }; | ||
// obj1: 5 sting keys and values | ||
obj1 = {'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e'}; | ||
var shared = require('./shared.js'); | ||
// obj2: 5 integer keys and values | ||
obj2 = {1: 1, 2: 2, 3: 3, 4: 4, 5: 5}; | ||
// obj3: 1000 string keys and values | ||
obj3 = {}; | ||
for (var i = 0; i < 1000; i++) { | ||
obj3['_' + i] = '_' + i; | ||
} | ||
// obj4: 1000 integer keys and values | ||
obj4 = {}; | ||
for (var i = 0; i < 1000; i++) { | ||
obj4[i] = i; | ||
} | ||
arr1 = [1, 2, 3, 4, 5]; | ||
arr2 = []; | ||
for (var i = 0; i < 1000; i++) { | ||
arr2.push(i); | ||
} | ||
// regular for(var i in obj) cloner | ||
regular = function(obj) { var result = {}; for(var i in obj) result[i] = obj[i]; return result; }; | ||
assert.deepEqual(obj1, regular(obj1)); | ||
// regular cloner with own checks | ||
regular_own = function(obj) { var result = {}; for(var i in obj) if (obj.hasOwnProperty(i)) result[i] = obj[i]; return result; }; | ||
assert.deepEqual(obj1, regular_own(obj1)); | ||
// regular cloner with own checks | ||
regular_keys = function(obj) { var result = {}; var props = Object.keys(obj); for(var i = 0, l = props.length; i < l; i++) result[i] = obj[i]; return result; }; | ||
assert.deepEqual(obj1, regular_own(obj1)); | ||
// static cloner | ||
function createStatic(obj) { | ||
var parts = []; | ||
for (var j in obj) if (obj.hasOwnProperty(j)) { | ||
parts.push('"' + j + '": obj["' + j + '"]'); | ||
} | ||
var code = 'return {' + parts.join(',') + '}'; | ||
return new Function('obj', code); | ||
} | ||
static1 = createStatic(obj1); | ||
static2 = createStatic(obj2); | ||
static3 = createStatic(obj3); | ||
static4 = createStatic(obj4); | ||
assert.deepEqual(obj1, static1(obj1)); | ||
var Cloner = require('..').Cloner; | ||
cloner = new Cloner(false); | ||
var suite = new Benchmark.Suite; | ||
suite.on('cycle', function(event) { | ||
console.log(String(event.target)); | ||
}); | ||
suite.on('complete', function() { | ||
console.log('Fastest is ' + this.filter('fastest').pluck('name')); | ||
}); | ||
suite.add('obj1 for in ', 'regular(obj1)'); | ||
suite.add('obj1 for in hasOwnProperty ', 'regular_own(obj1)'); | ||
suite.add('obj1 for Object.keys ', 'regular_keys(obj1)'); | ||
suite.add('obj1 static cloner ', 'static1(obj1)'); | ||
suite.add('obj1 lodash.clone ', 'lodash.clone(obj1, false)'); | ||
suite.add('obj1 _.clone ', '_.clone(obj1)'); | ||
suite.add('obj1 node-v8-clone cloner ', 'cloner.clone(obj1)'); | ||
suite.add('obj2 for in ', 'regular(obj2)'); | ||
suite.add('obj2 for in hasOwnProperty ', 'regular_own(obj2)'); | ||
suite.add('obj2 for Object.keys ', 'regular_keys(obj2)'); | ||
suite.add('obj2 static cloner ', 'static2(obj2)'); | ||
suite.add('obj2 lodash.clone ', 'lodash.clone(obj2, false)'); | ||
suite.add('obj2 _.clone ', '_.clone(obj2)'); | ||
suite.add('obj2 node-v8-clone cloner ', 'cloner.clone(obj2)'); | ||
suite.add('obj3 for in ', 'regular(obj3)'); | ||
suite.add('obj3 for in hasOwnProperty ', 'regular_own(obj3)'); | ||
suite.add('obj3 for Object.keys ', 'regular_keys(obj3)'); | ||
suite.add('obj3 static cloner ', 'static3(obj3)'); | ||
suite.add('obj3 lodash.clone ', 'lodash.clone(obj3, false)'); | ||
suite.add('obj3 _.clone ', '_.clone(obj3)'); | ||
suite.add('obj3 node-v8-clone cloner ', 'cloner.clone(obj3)'); | ||
suite.add('obj4 for in ', 'regular(obj4)'); | ||
suite.add('obj4 for in hasOwnProperty ', 'regular_own(obj4)'); | ||
suite.add('obj4 for Object.keys ', 'regular_keys(obj4)'); | ||
suite.add('obj4 static cloner ', 'static4(obj4)'); | ||
suite.add('obj4 lodash.clone ', 'lodash.clone(obj4, false)'); | ||
suite.add('obj4 _.clone ', '_.clone(obj4)'); | ||
suite.add('obj4 node-v8-clone cloner ', 'cloner.clone(obj4)'); | ||
suite.run({ 'async': true }); | ||
['objs1', 'objs2', 'objs3', 'objs4', 'objs5', 'objn1', 'objn2', 'objn3', 'objn4', 'objn5'].forEach(function(obj) { | ||
global[obj] = shared[obj]; | ||
shared.benchmark(obj, [ | ||
['for in', 'regular(' + obj + ')'], | ||
['for own', 'regular_own(' + obj + ')'], | ||
['for Obj.keys', 'regular_keys(' + obj + ')'], | ||
['lodash.clone', 'lodash.clone(' + obj + ', false)'], | ||
['_.clone', '_.clone(' + obj + ')'], | ||
['owl.copy', 'owl.copy(' + obj + ')'], | ||
['node-v8-clone', 'cloner.clone(' + obj + ')'] | ||
]); | ||
}); |
@@ -1,42 +0,35 @@ | ||
var Benchmark = require('benchmark'); | ||
var assert = require('assert'); | ||
try { _ = require('lodash'); } catch (e) {}; | ||
try { lodash = require('lodash'); } catch (e) {}; | ||
try { _ = require('underscore'); } catch (e) {}; | ||
try { owl = require('owl-deepcopy'); } catch(e) { console.warn('owl-deepcopy module is not installed'); }; | ||
// RegExp | ||
re = new RegExp('a', 'gi'); | ||
reFlags = /\w*$/; | ||
var shared = require('./shared.js'); | ||
// node-v8-clone js | ||
clone = require('..').clone; | ||
assert.deepEqual(re, clone(re)); | ||
// node-v8-clone | ||
v8_clone = require('..').v8_clone; | ||
assert.deepEqual(re, v8_clone(re)); | ||
var Cloner = require('..').Cloner; | ||
cloner = new Cloner(false); | ||
// RegExp 'new RegExp(re)' cloner | ||
re_clone1 = function(re) { return new RegExp(re); }; | ||
// RegExp 'new RegExp(re.source, /\w*$/.exec(re))' cloner | ||
re_clone = function(re) { return new RegExp(re.source, reFlags.exec(re)); } | ||
assert.deepEqual(re, re_clone(re)); | ||
reFlags = /\w*$/; | ||
re_clone2 = function(re) { return new RegExp(re.source, reFlags.exec(re)); }; | ||
// RegExp 'new RegExp(source, flags)' cloner | ||
re_clone2 = function(re) { | ||
re_clone3 = function(re) { | ||
var flags = (re.global ? 'g' : '') + (re.ignoreCase ? 'i' : '') + (re.multiline ? 'm' : ''); | ||
return new RegExp(re.source, flags); | ||
} | ||
assert.deepEqual(re, re_clone2(re)); | ||
}; | ||
var suite = new Benchmark.Suite; | ||
suite.on('cycle', function(event) { | ||
console.log(String(event.target)); | ||
['re'].forEach(function(obj) { | ||
global[obj] = shared[obj]; | ||
shared.benchmark(obj, [ | ||
['new RegExp(re)', 're_clone1(re)'], | ||
['new RegExp(re.source, /\\w*$/.exec(re))', 're_clone2(re)'], | ||
['new RegExp(re.source, "g"? + "i"? + "m"?)', 're_clone3(re)'], | ||
['_.clone', '_.clone(re)'], | ||
['lodash.clone', 'lodash.clone(re, false)'], | ||
['node-v8-clone', 'cloner.clone(re, false)'] | ||
]); | ||
}); | ||
suite.on('complete', function() { | ||
console.log('Fastest is ' + this.filter('fastest').pluck('name')); | ||
}); | ||
suite.add('RegExp new RegExp(re.source, /\\w*$/.exec(re)) ', 're_clone(re)'); | ||
suite.add('RegExp new RegExp(re.source, "g"? + "i"? + "m"?)', 're_clone2(re)'); | ||
suite.add('RegExp lodash _.clone ', '_.clone(re, false)'); | ||
suite.add('RegExp node-v8-clone js cloner ', 'clone(re, false)'); | ||
suite.add('RegExp node-v8-clone cloner ', 'v8_clone(re)'); | ||
suite.run({ 'async': true }); |
@@ -84,3 +84,6 @@ "use strict"; | ||
var f = this._map[value.constructor.name] || this._deepCloneObjectProperties; | ||
var f = this._deepCloneObjectProperties; | ||
if (value.constructor && this._map[value.constructor.name]) { | ||
f = this._map[value.constructor.name]; | ||
} | ||
f(this, result); | ||
@@ -87,0 +90,0 @@ return result; |
{ | ||
"name": "node-v8-clone", | ||
"version": "0.3.0", | ||
"version": "0.4.0", | ||
"description": "The most convenient and accurate cloner for node.js. It's also very fast in some cases (benchmarks inside).", | ||
@@ -8,2 +8,3 @@ "main": "lib/clone.js", | ||
"test": "node_modules/.bin/mocha -R spec test/test.js", | ||
"test-3rdparty": "node_modules/.bin/mocha -R spec test/3rdparty.js --colors 2>/dev/null; exit 0", | ||
"benchmark": "node bench/arrays.js; node bench/class.js; node bench/date.js; node bench/deep.js; node bench/deep_array.js; node bench/number.js; node bench/object.js; node bench/regexp.js", | ||
@@ -26,11 +27,13 @@ "install": "node-gyp rebuild" | ||
"readmeFilename": "README.md", | ||
"dependencies": { | ||
}, | ||
"dependencies": {}, | ||
"devDependencies": { | ||
"benchmark": "~1.0.0", | ||
"mocha": "~1.7.0", | ||
"benchmark": "*", | ||
"mocha": "*", | ||
"cloneextend": "*", | ||
"clone": "*", | ||
"lodash": "*" | ||
"lodash": "*", | ||
"underscore": "*", | ||
"benchmark.js-plot": "*", | ||
"owl-deepcopy": "*" | ||
} | ||
} |
@@ -7,2 +7,3 @@ var assert = require('assert'); | ||
var clone = require('clone'); | ||
var owl = require('owl-deepcopy'); | ||
@@ -50,3 +51,2 @@ describe('lodash.clone(value)', function(){ | ||
}); | ||
describe('underscore.clone(value)', function(){ | ||
@@ -60,1 +60,21 @@ beforeEach(function(){ | ||
}); | ||
describe('owl.copy(value)', function(){ | ||
beforeEach(function(){ | ||
this.clone = function(value) { | ||
return owl.copy(value); | ||
}; | ||
}); | ||
shared.behavesAsShallow(); | ||
}); | ||
describe('owl.deepcopy(value)', function(){ | ||
beforeEach(function(){ | ||
this.clone = function(value) { | ||
return owl.deepCopy(value); | ||
}; | ||
}); | ||
shared.behavesAsShallow(); | ||
shared.behavesAsDeep(); | ||
shared.behavesAsDeepWCircular(); | ||
}); |
var assert = require('assert'); | ||
var util = require('util'); | ||
@@ -79,3 +80,3 @@ module.exports.behavesAsShallow = function() { | ||
}); | ||
it('should clone objects', function(){ | ||
it('should clone {} objects', function(){ | ||
var a = {x : 1, y: 2}; | ||
@@ -89,2 +90,21 @@ var b = this.clone(a); | ||
}); | ||
it('should clone Object.create(null) objects', function(){ | ||
var a = Object.create(null); | ||
a.x = 1; | ||
a.y = 2; | ||
var b = this.clone(a); | ||
assert.ok(a !== b); | ||
assert.equal(a.x, 1); | ||
assert.equal(a.y, 2); | ||
assert.equal(b.x, 1); | ||
assert.equal(b.y, 2); | ||
}); | ||
it('should clone inherited objects', function(){ | ||
var a = Object.create({ q: 1 }); | ||
var b = this.clone(a); | ||
assert.ok(a !== b); | ||
assert.equal(a.q, 1); | ||
assert.equal(b.q, 1); | ||
assert.ok(a.__proto__ === b.__proto__); | ||
}); | ||
it('should clone arrays', function(){ | ||
@@ -190,2 +210,4 @@ var a = [1, 2]; | ||
}); | ||
it('should clone Buffer objects', false, function(){ | ||
}); | ||
}); | ||
@@ -213,2 +235,21 @@ describe('should clone custom objects', function(){ | ||
}); | ||
it('should clone inherited instances', function(){ | ||
var clazz1 = function(c) { this.c = c }; | ||
clazz1.prototype.e = 1; | ||
var clazz2 = function (c) { this.c = c }; | ||
util.inherits(clazz2, clazz1); | ||
clazz2.prototype.d = 2; | ||
var a = new clazz2(3); | ||
var b = this.clone(a); | ||
assert.ok(a !== b); | ||
assert.ok(a.hasOwnProperty('c')); | ||
assert.ok(b.hasOwnProperty('c')); | ||
assert.ok(!a.hasOwnProperty('e')); | ||
assert.ok(!b.hasOwnProperty('e')); | ||
assert.ok(!a.hasOwnProperty('d')); | ||
assert.ok(!b.hasOwnProperty('d')); | ||
assert.equal(a.c, b.c); | ||
assert.equal(a.e, b.e); | ||
assert.equal(a.d, b.d); | ||
}); | ||
}); | ||
@@ -215,0 +256,0 @@ }; |
Uses eval
Supply chain riskPackage uses eval() which is a dangerous function. This prevents the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses eval() which is a dangerous function. This prevents the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
41267
8
19
976