Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 1. MessageChannel
- (async () => {
- const structuredCloneAsync = value =>
- new Promise(resolve => {
- const { port1: inPort, port2: outPort } = new MessageChannel();
- outPort.onmessage = ({data: {value}}) => resolve(value);
- inPort.postMessage({value});
- });
- const original = { date: new Date(), number: Math.random() };
- original.self = original;
- console.time('Clone MessageChannel')
- const clone = await structuredCloneAsync(original);
- console.timeEnd('Clone MessageChannel')
- // different objects:
- console.assert(original !== clone);
- console.assert(original.date !== clone.date);
- // cyclical:
- console.assert(original.self === original);
- console.assert(clone.self === clone);
- // equivalent values:
- console.assert(original.number === clone.number);
- console.assert(Number(original.date) === Number(clone.date));
- console.log("Assertions complete - MessageChannel.");
- })();
- // 2. history
- (() => {
- const structuredClone = obj => {
- const oldState = history.state;
- history.replaceState(obj, null);
- const clonedObj = history.state;
- history.replaceState(oldState, null);
- return clonedObj;
- };
- const original = { date: new Date(), number: Math.random() };
- original.self = original;
- console.time('Clone history')
- const clone = structuredClone(original);
- console.timeEnd('Clone history');
- // different objects:
- console.assert(original !== clone);
- console.assert(original.date !== clone.date);
- // cyclical:
- console.assert(original.self === original);
- console.assert(clone.self === clone);
- // equivalent values:
- console.assert(original.number === clone.number);
- console.assert(Number(original.date) === Number(clone.date));
- console.log("Assertions complete - history.");
- })();
- // 3. Notification
- (() => {
- const structuredClone = obj => {
- const n = new Notification('', {data: obj, silent: true});
- n.onshow = n.close;
- return n.data;
- };
- const original = { date: new Date(), number: Math.random() };
- original.self = original;
- console.time('Clone Notification')
- const clone = structuredClone(original);
- console.timeEnd('Clone Notification');
- // different objects:
- console.assert(original !== clone);
- console.assert(original.date !== clone.date);
- // cyclical:
- console.assert(original.self === original);
- console.assert(clone.self === clone);
- // equivalent values:
- console.assert(original.number === clone.number);
- console.assert(Number(original.date) === Number(clone.date));
- console.log("Assertions complete - Notification.");
- })();
Add Comment
Please, Sign In to add comment