node-v8-clone
Advanced tools
Comparing version 0.2.0 to 0.2.1
@@ -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)'); |
@@ -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 @@ }, |
110
README.md
@@ -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) | ||
``` |
202
test/deep.js
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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
31767
18
697
94