Socket
Socket
Sign inDemoInstall

node-v8-clone

Package Overview
Dependencies
Maintainers
1
Versions
17
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

node-v8-clone - npm Package Compare versions

Comparing version 0.2.0 to 0.2.1

bench/deep_array.js

2

bench/arrays.js

@@ -46,2 +46,3 @@ var Benchmark = require('benchmark');

suite.add('arr1 slice() ', 'arr1.slice()');
suite.add('arr1 [] for i < l i++ ', 'arr_for(arr1)');

@@ -55,2 +56,3 @@ suite.add('arr1 Array(l) for i < l i++ ', 'arr_for2(arr1)');

suite.add('arr2 slice() ', 'arr2.slice()');
suite.add('arr2 [] for i < l i++ ', 'arr_for(arr2)');

@@ -57,0 +59,0 @@ suite.add('arr2 Array(l) for i < l i++ ', 'arr_for2(arr2)');

89

bench/deep.js

@@ -5,45 +5,16 @@ var Benchmark = require('benchmark');

// obj1: 5 sting keys and values
obj1 = {'a': 'a', 'b': {'c': 'c', 'd': 'd', 'e': 'e'}};
// deep1: 5 sting keys and values
deep1 = {a: 'a', b: {c: 'c', d: 'd', e: 'e'}, f: 'f'};
// obj2: 5 integer keys and values
obj2 = {1: 1, 2: {3: 3, 4: 4, 5: 5}};
// deep2: 5 integer keys and values
deep2 = {1: 1, 2: {3: 3, 4: 4, 5: 5}, 6: 6};
// obj3: 1000 string keys and values
obj3 = {};
// deep3: 1000 x 1 x 3 x 3 objects with string keys and values
deep3 = {};
for (var i = 0; i < 1000; i++) {
obj3['_' + i] = {
deep3['_' + i] = {
a: {
b: {
c: {},
d: {},
e: {}
},
f: {
g: {},
h: {},
i: {}
},
j: {
k: {},
l: {},
m: {}
}
},
n: {
b: {
c: {},
d: {},
e: {}
},
f: {
g: {},
h: {},
i: {}
},
j: {
k: {},
l: {},
m: {}
}
b: {c: 'c', d: 'd', e: 'e'},
f: {g: 'g', h: 'h', i: 'i'},
j: {k: 'k', l: 'l', m: 'm'}
}

@@ -53,6 +24,12 @@ };

// obj4: 1000 integer keys and values
obj4 = {};
// deep4: 1000 x 1 x 3 x 3 objects with int keys and values
deep4 = {};
for (var i = 0; i < 1000; i++) {
obj4[i] = obj2;
deep4[i] = {
1: {
2: {3: 3, 4: 4, 5: 5},
6: {7: 7, 8: 8, 9: 9},
10: {11: 11, 12: 12, 13: 13}
}
};
}

@@ -62,7 +39,7 @@

clone = require('..').clone;
assert.deepEqual(obj1, clone(obj1));
assert.deepEqual(deep1, clone(deep1));
// node-v8-clone
v8_deepclone = require('..').v8_deepclone;
assert.deepEqual(obj1, v8_deepclone(obj1));
assert.deepEqual(deep1, v8_deepclone(deep1));

@@ -77,19 +54,19 @@ var suite = new Benchmark.Suite;

suite.add('obj1 lodash _.clone ', '_.clone(obj1, true)');
suite.add('obj1 node-v8-clone js cloner ', 'clone(obj1, true)');
suite.add('obj1 node-v8-clone cloner ', 'v8_deepclone(obj1)');
suite.add('deep1 lodash _.clone ', '_.clone(deep1, true)');
suite.add('deep1 node-v8-clone js cloner ', 'clone(deep1, true)');
suite.add('deep1 node-v8-clone cloner ', 'v8_deepclone(deep1)');
suite.add('obj2 lodash _.clone ', '_.clone(obj2, true)');
suite.add('obj2 node-v8-clone js cloner ', 'clone(obj2, true)');
suite.add('obj2 node-v8-clone cloner ', 'v8_deepclone(obj2)');
suite.add('deep2 lodash _.clone ', '_.clone(deep2, true)');
suite.add('deep2 node-v8-clone js cloner ', 'clone(deep2, true)');
suite.add('deep2 node-v8-clone cloner ', 'v8_deepclone(deep2)');
suite.add('obj3 lodash _.clone ', '_.clone(obj3, true)');
suite.add('obj3 node-v8-clone js cloner ', 'clone(obj3, true)');
suite.add('obj3 node-v8-clone cloner ', 'v8_deepclone(obj3)');
suite.add('deep3 lodash _.clone ', '_.clone(deep3, true)');
suite.add('deep3 node-v8-clone js cloner ', 'clone(deep3, true)');
suite.add('deep3 node-v8-clone cloner ', 'v8_deepclone(deep3)');
suite.add('obj4 lodash _.clone ', '_.clone(obj4, true)');
suite.add('obj4 node-v8-clone js cloner ', 'clone(obj4, true)');
suite.add('obj4 node-v8-clone cloner ', 'v8_deepclone(obj4)');
suite.add('deep4 lodash _.clone ', '_.clone(deep4, true)');
suite.add('deep4 node-v8-clone js cloner ', 'clone(deep4, true)');
suite.add('deep4 node-v8-clone cloner ', 'v8_deepclone(deep4)');
suite.run({ 'async': true });

@@ -16,3 +16,3 @@ "use strict";

// based on type
if ((value === null) || (typeof value !== 'object')) {
if ((value === null) || (typeof value !== 'object' && typeof value !== 'function')) {
return value;

@@ -19,0 +19,0 @@ }

{
"name": "node-v8-clone",
"version": "0.2.0",
"version": "0.2.1",
"description": "UNSTABLE yet. Exposed v8 clone function for node.js.",

@@ -8,3 +8,3 @@ "main": "lib/clone.js",

"test": "node_modules/.bin/mocha",
"benchmark": "node bench/arrays.js; node bench/class.js; node bench/date.js; node bench/deep.js; node bench/number.js; node bench/object.js; node bench/regexp.js",
"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",
"install": "node-gyp rebuild"

@@ -11,0 +11,0 @@ },

@@ -5,63 +5,91 @@ node-v8-clone

Expose v8 shallow clone function for node.js.
It's a c++ addon for node.js that does the most accurate cloning for node.js.
It's also very fast in some cases (benchmarks inside).
Installation:
=============
Tested on node.js versions 0.4, 0.6. 0.8 and 0.9.
```
npm install node-v8-clone
```
Usage:
======
```javascript
var clone = require('node-v8-clone').clone;
var a = { x: { y: {} } };
// deep clone
var b = clone(a, true);
a === b // false
a.x === b.x // false
a.x.y === b.x.y // false
// shallow clone
c = clone(a, false);
a === c // false
a.x === c.x // true
a.x.y === c.x.y // true
```
Benchmark results
=================
Object cloning:
Object shallow cloning:
```
obj1 = {a: 'a', b: 'b', c: 'c', d: 'd', e: 'e'}
obj1 for in x 554,737 ops/sec ±1.35% (80 runs sampled)
obj1 for in hasOwnProperty x 390,519 ops/sec ±1.46% (93 runs sampled)
obj1 lodash _.clone x 221,200 ops/sec ±0.80% (92 runs sampled)
obj1 node-v8-clone cloner x 4,818,032 ops/sec ±1.81% (88 runs sampled)
obj1 for in x 810,922 ops/sec ±1.31% (88 runs sampled)
obj1 for in hasOwnProperty x 572,086 ops/sec ±0.94% (91 runs sampled)
obj1 lodash _.clone x 364,218 ops/sec ±0.91% (89 runs sampled)
obj1 node-v8-clone js cloner x 5,230,347 ops/sec ±2.01% (91 runs sampled)
obj2 = {1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
obj2 for in x 422,927 ops/sec ±1.21% (90 runs sampled)
obj2 for in hasOwnProperty x 299,434 ops/sec ±0.97% (91 runs sampled)
obj2 lodash _.clone x 254,220 ops/sec ±0.78% (90 runs sampled)
obj2 node-v8-clone cloner x 3,922,297 ops/sec ±0.97% (89 runs sampled)
obj2 for in x 493,469 ops/sec ±1.79% (86 runs sampled)
obj2 for in hasOwnProperty x 385,693 ops/sec ±1.53% (86 runs sampled)
obj2 lodash _.clone x 400,466 ops/sec ±2.88% (92 runs sampled)
obj2 node-v8-clone js cloner x 3,676,889 ops/sec ±2.58% (88 runs sampled)
obj3 = {_0: '_0', _1: '_1', ..., _999: '_999' }
obj3 for in x 1,277 ops/sec ±1.02% (93 runs sampled)
obj3 for in hasOwnProperty x 1,091 ops/sec ±1.25% (89 runs sampled)
obj3 lodash _.clone x 1,613 ops/sec ±0.54% (87 runs sampled)
obj3 node-v8-clone cloner x 19,278 ops/sec ±0.77% (86 runs sampled)
obj3 for in x 1,542 ops/sec ±2.34% (84 runs sampled)
obj3 for in hasOwnProperty x 940 ops/sec ±1.26% (91 runs sampled)
obj3 lodash _.clone x 2,112 ops/sec ±1.12% (93 runs sampled)
obj3 node-v8-clone js cloner x 40,405 ops/sec ±2.58% (94 runs sampled)
obj4 = {0: 0, 1: 1, 2: 2, ..., 998: 998, 999: 999 }
obj4 for in x 3,493 ops/sec ±0.94% (89 runs sampled)
obj4 for in hasOwnProperty x 1,854 ops/sec ±1.12% (86 runs sampled)
obj4 lodash _.clone x 4,223 ops/sec ±0.77% (87 runs sampled)
obj4 node-v8-clone cloner x 175,836 ops/sec ±0.59% (93 runs sampled)
obj4 for in x 4,431 ops/sec ±2.43% (86 runs sampled)
obj4 for in hasOwnProperty x 2,544 ops/sec ±1.62% (91 runs sampled)
obj4 lodash _.clone x 5,407 ops/sec ±2.49% (82 runs sampled)
obj4 node-v8-clone js cloner x 359,146 ops/sec ±2.70% (87 runs sampled)
```
Array cloning:
Array shallow cloning:
```
arr1 = [1, 2, 3, 4, 5]
arr1 [] for i < l i++ x 4,967,530 ops/sec ±1.20% (88 runs sampled)
arr1 Array(l) for i < l i++ x 14,920,448 ops/sec ±1.66% (84 runs sampled)
arr1 for in x 639,140 ops/sec ±1.08% (91 runs sampled)
arr1 for in hasOwnProperty x 430,562 ops/sec ±1.21% (90 runs sampled)
arr1 lodash _.clone x 1,065,184 ops/sec ±0.86% (93 runs sampled)
arr1 node-v8-clone cloner x 4,905,732 ops/sec ±1.11% (89 runs sampled)
arr1 slice() x 8,230,013 ops/sec ±2.86% (91 runs sampled)
arr1 [] for i < l i++ x 7,816,764 ops/sec ±2.50% (82 runs sampled)
arr1 Array(l) for i < l i++ x 22,090,328 ops/sec ±1.36% (88 runs sampled)
arr1 for in x 816,995 ops/sec ±1.50% (91 runs sampled)
arr1 for in hasOwnProperty x 499,472 ops/sec ±2.83% (87 runs sampled)
arr1 lodash _.clone x 1,520,163 ops/sec ±1.76% (84 runs sampled)
arr1 node-v8-clone js cloner x 5,105,788 ops/sec ±2.07% (90 runs sampled)
arr2 = [0, 1, 2, ..., 998, 999]
arr2 [] for i < l i++ x 70,299 ops/sec ±1.25% (88 runs sampled)
arr2 Array(l) for i < l i++ x 126,915 ops/sec ±1.05% (82 runs sampled)
arr2 for in x 6,528 ops/sec ±1.06% (87 runs sampled)
arr2 for in hasOwnProperty x 3,103 ops/sec ±0.83% (89 runs sampled)
arr2 lodash _.clone x 201,249 ops/sec ±0.73% (97 runs sampled)
arr2 node-v8-clone cloner x 224,291 ops/sec ±0.99% (93 runs sampled)
arr2 slice() x 522,115 ops/sec ±0.93% (95 runs sampled)
arr2 [] for i < l i++ x 120,464 ops/sec ±1.55% (90 runs sampled)
arr2 Array(l) for i < l i++ x 269,733 ops/sec ±1.39% (91 runs sampled)
arr2 for in x 7,908 ops/sec ±1.91% (93 runs sampled)
arr2 for in hasOwnProperty x 3,967 ops/sec ±0.92% (93 runs sampled)
arr2 lodash _.clone x 413,365 ops/sec ±1.09% (93 runs sampled)
arr2 node-v8-clone js cloner x 493,603 ops/sec ±0.59% (94 runs sampled)
```
RegExp cloning:
RegExp shallow cloning:
```
RegExp new RegExp(re.source, /w*$/.exec(re)) x 603,999 ops/sec ±0.88% (92 runs sampled)
RegExp new RegExp(re.source, "g"? + "i"? + "m"?) x 2,721,745 ops/sec ±1.04% (92 runs sampled)
RegExp lodash _.clone x 803,133 ops/sec ±0.80% (85 runs sampled)
RegExp node-v8-clone cloner x 4,881,923 ops/sec ±0.90% (85 runs sampled)
RegExp new RegExp(re.source, /\w*$/.exec(re)) x 1,004,526 ops/sec ±2.53% (91 runs sampled)
RegExp new RegExp(re.source, "g"? + "i"? + "m"?) x 3,550,976 ops/sec ±3.00% (90 runs sampled)
RegExp lodash _.clone x 1,119,311 ops/sec ±1.79% (85 runs sampled)
RegExp node-v8-clone js cloner x 5,000,977 ops/sec ±1.33% (94 runs sampled)
```
Date cloning:
Date shallow cloning:
```
date new Date(+date) cloner x 3,228,313 ops/sec ±1.18% (91 runs sampled)
date lodash _.clone x 828,106 ops/sec ±0.78% (87 runs sampled)
date node-v8-clone cloner x 4,790,220 ops/sec ±0.87% (88 runs sampled)
date new Date(+date) cloner x 2,657,488 ops/sec ±2.52% (87 runs sampled)
date lodash _.clone x 1,185,187 ops/sec ±1.63% (93 runs sampled)
date node-v8-clone cloner x 5,147,363 ops/sec ±0.98% (93 runs sampled)
```
var assert = require("assert")
var clone = require('..').clone;
var v8_clone = require('..').v8_clone;
var v8_deepclone = require('..').v8_deepclone;
describe('v8_deepclone', function(){
describe('v8_deepclone()', function(){
it('should deep clone plain objects', function(){
var a = {x : 1, y: 2};
var b = v8_deepclone(a);
assert.equal(a.x, 1);
assert.equal(a.y, 2);
assert.equal(b.x, 1);
assert.equal(b.y, 2);
a.x = 3;
assert.equal(a.x, 3);
assert.equal(a.y, 2);
assert.equal(b.x, 1);
assert.equal(b.y, 2);
assert.deepEqual(a, b);
assert.ok(a !== b);
});

@@ -23,11 +15,5 @@ it('should deep clone nested objects', function(){

var b = v8_deepclone(a);
assert.equal(a.x.z, 1);
assert.equal(a.y, 2);
assert.equal(b.x.z, 1);
assert.equal(b.y, 2);
a.x.z = 3;
assert.equal(a.x.z, 3);
assert.equal(a.y, 2);
assert.equal(b.x.z, 1);
assert.equal(b.y, 2);
assert.deepEqual(a, b);
assert.ok(a !== b);
assert.ok(a.x !== b.x);
});

@@ -37,10 +23,66 @@ it('should deep clone nested arrays', function(){

var b = v8_deepclone(a);
assert.deepEqual(a, [[1], 2]);
assert.deepEqual(b, [[1], 2]);
a[0][0] = 3;
assert.deepEqual(a, [[3], 2]);
assert.deepEqual(b, [[1], 2]);
assert.deepEqual(a, b);
assert.ok(b !== a);
assert.ok(b[0] !== a[0]);
});
it('should deep clone circular arrays');
it('should deep clone circular objects');
it('should clone nested objects with internal refs', function() {
var r = [1];
var a = [r, r];
var b = v8_deepclone(a);
assert.deepEqual(a, b);
assert.ok(a !== b);
assert.ok(a[0] === a[1]);
assert.ok(a[0] !== b[0]);
assert.ok(b[0] === b[1]);
});
it('should deep clone circular arrays', function(){
var array = [
[[[]]],
[]
];
array[0][0][0][0] = array;
array[1][0] = array[0][0];
var cloned = v8_deepclone(array);
assert.ok(cloned[1][0] === cloned[0][0] && cloned === cloned[0][0][0][0] && cloned !== array);
});
it('should deep clone circular objects (lodash version)', function(){
var object = {
'foo': { 'b': { 'foo': { 'c': { } } } },
'bar': { }
};
object.foo.b.foo.c = object;
object.bar.b = object.foo.b;
var cloned = v8_deepclone(object);
assert.ok(cloned.bar.b === cloned.foo.b && cloned === cloned.foo.b.foo.c && cloned !== object);
});
it('should deep clone functions with custom properties', function() {
var a = function() {};
a.x = {y: 'z'};
var b = v8_deepclone(a);
assert.deepEqual(a.x, b.x);
assert.ok(a !== b);
assert.ok(a.x !== a.y);
});
it('should deep clone closures, but with a shared context', function() {
var f = function() {
var i = 0;
return function() {
return ++i;
}
};
// closure
var a = f();
assert.equal(a(), 1);
assert.equal(a(), 2);
var b = v8_deepclone(a);
assert.ok(a !== b);
assert.equal(a(), 3);
assert.equal(b(), 4);
});
});

@@ -51,11 +93,4 @@ describe('clone()', function(){

var b = clone(a, true);
assert.equal(a.x, 1);
assert.equal(a.y, 2);
assert.equal(b.x, 1);
assert.equal(b.y, 2);
a.x = 3;
assert.equal(a.x, 3);
assert.equal(a.y, 2);
assert.equal(b.x, 1);
assert.equal(b.y, 2);
assert.deepEqual(a, b);
assert.ok(a !== b);
});

@@ -65,11 +100,5 @@ it('should deep clone nested objects', function(){

var b = clone(a, true);
assert.equal(a.x.z, 1);
assert.equal(a.y, 2);
assert.equal(b.x.z, 1);
assert.equal(b.y, 2);
a.x.z = 3;
assert.equal(a.x.z, 3);
assert.equal(a.y, 2);
assert.equal(b.x.z, 1);
assert.equal(b.y, 2);
assert.deepEqual(a, b);
assert.ok(a !== b);
assert.ok(a.x !== b.x);
});

@@ -79,39 +108,27 @@ it('should deep clone nested arrays', function(){

var b = clone(a, true);
assert.deepEqual(a, [[1], 2]);
assert.deepEqual(b, [[1], 2]);
a[0][0] = 3;
assert.deepEqual(a, [[3], 2]);
assert.deepEqual(b, [[1], 2]);
assert.deepEqual(a, b);
assert.ok(b !== a);
assert.ok(b[0] !== a[0]);
});
it('should deep clone circular arrays', function(){
var a = [[1], 2];
a.push(a);
it('should clone nested objects with internal refs', function() {
var r = [1];
var a = [r, r];
var b = clone(a, true);
assert.equal(a[0][0], 1);
assert.equal(a[1], 2);
assert.equal(a[2][0][0], 1);
assert.equal(b[0][0], 1);
assert.equal(b[1], 2);
assert.equal(b[2][0][0], 1);
a[0][0] = 3;
assert.equal(a[0][0], 3);
assert.equal(a[1], 2);
assert.equal(a[2][0][0], 3);
assert.equal(b[0][0], 1);
assert.equal(b[1], 2);
assert.equal(b[2][0][0], 1);
assert.deepEqual(a, b);
assert.ok(a !== b);
assert.ok(a[0] === a[1]);
assert.ok(a[0] !== b[0]);
assert.ok(b[0] === b[1]);
});
it('should deep clone circular objects', function(){
var a = {x: {y: 1}, z: null};
a.z = a;
var b = clone(a, true);
assert.equal(a.x.y, 1);
assert.equal(a.z.x.y, 1);
assert.equal(b.x.y, 1);
assert.equal(b.z.x.y, 1);
a.z.z.z.x.y = 2;
assert.equal(a.x.y, 2);
assert.equal(a.z.x.y, 2);
assert.equal(b.x.y, 1);
assert.equal(b.z.x.y, 1);
it('should deep clone circular arrays', function(){
var array = [
[[[]]],
[]
];
array[0][0][0][0] = array;
array[1][0] = array[0][0];
var cloned = clone(array, true);
assert.ok(cloned[1][0] === cloned[0][0] && cloned === cloned[0][0][0][0] && cloned !== array);
});

@@ -129,2 +146,29 @@ it('should deep clone circular objects (lodash version)', function(){

});
it('should deep clone functions with custom properties', function() {
var a = function() {};
a.x = {y: 'z'};
var b = clone(a, true);
assert.deepEqual(a.x, b.x);
assert.ok(a !== b);
assert.ok(a.x !== a.y);
});
it('should deep clone closures, but with a shared context', function() {
var f = function() {
var i = 0;
return function() {
return ++i;
}
};
// closure
var a = f();
assert.equal(a(), 1);
assert.equal(a(), 2);
var b = clone(a, true);
assert.ok(a !== b);
assert.equal(a(), 3);
assert.equal(b(), 4);
});
});

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc