Skip to content

Instantly share code, notes, and snippets.

View ositowang's full-sized avatar
👨‍💻
10000 hours in progress

Osito_Wang ositowang

👨‍💻
10000 hours in progress
  • Massachusetts
View GitHub Profile
@ositowang
ositowang / jsonDeepClone.js
Created March 30, 2019 22:37
Object Deep Clone with Javascript
var newObj = JSON.parse( JSON.stringify( someObj ) );
@ositowang
ositowang / simplestDeepClone.js
Created April 1, 2019 01:11
Maybe good enough for interview Simpliest Version of deepClone.
/**
* Maybe good enough for interview Simpliest Version of deepClone.
* Problems:
* 1. the type check of object is not strict
* 2. did not cover array
* 3. did not cover null
* @param {Object} sourceObj
* @returns
*/
var deepCloneSimple = (sourceObj) => {
@ositowang
ositowang / betterDeepClone.js
Created April 1, 2019 01:16
More comprehensive deepclone with JS. Cover null and Array.
/**
* You should be good with this solution
* More comprehensive deepclone with JS. Cover null and Array.
* Problems:
* 1. did not solve the circular dependency
* @param {Object} sourceObj
* @returns
*/
var deepCloneBetter = (sourceObj) => {
// if we are not dealing with complex data structure
@ositowang
ositowang / ultimateDeepClone.js
Created April 1, 2019 01:22
Ultimate version solving circular dependency with weakMap
/**
* Ultimate version solving circular dependency with weakMap
* Problems:
* 1. Symbols not covered
*
* @param {Object} sourceObj
* @param {WeakMap} [hash=new WeakMap()]
* @returns
*/
var deepCloneUltimate = (sourceObj, hash = new WeakMap()) => {
@ositowang
ositowang / newOperator.js
Last active April 1, 2019 20:06
simulating the new operator in javascript
const objectContructor = (...args) => {
//get the constructor function
let constructor = [].shift.call(args);
/**
* create a new object and link the prototype to the function prototype
* equals to var obj = new Object(), obj.__proto__ = Constructor.prototype
*/
let obj = Object.create(constructor.prototype);
@ositowang
ositowang / updatednew.js
Created April 1, 2019 20:15
new operator simulation covering the return value
const objectContructorUltimate = (...args) => {
let constructor = [].shift.call(args);
let obj = Object.create(constructor.prototype);
let result = constructor.apply(obj, args);
// ensure we return an object
return (typeof result === 'object' && result) || obj;
};
@ositowang
ositowang / callScenario.js
Created April 2, 2019 21:18
pragmatic way of using call
var domNodeArrays = Array.prototype.slice.call(domNodes);
// now domNodeArrays has the unshift methods
domNodeArrays.unshift("h1");
let test = [1,2,3,4]
// we make a shallow copy of the orignal array, now we are isolated
let shallowCopy = [].slice.call(test)
test[1] = 4
console.log(shallowCopy[1])
@ositowang
ositowang / myOwnCallSimple.js
Created April 2, 2019 21:23
a simple version of the call() in javascript
/**
* We could get the parameters with arguments in Javacript. With ES6 spread
* operator, you could transform it into a real list. Notes: the first
* parameter is the this object, so we slice it.
* Problems:
* 1. we ignore the case the context passed in is primitive type
* 2. we ignore the case the context passed in is null
*
* @param {Object} [context=window]
* @returns
@ositowang
ositowang / myOwnCallUltimate.js
Created April 2, 2019 21:26
Ultimate version of call() in javascript
/**
* By checking the passed in context, we add an wrapper to primitive types or
* reset the this object to global one if null is passed in
*
* @param {*} context
* @returns
*/
Function.prototype.myOwnCallUltimate = function(context) {
// Object will tranform primitive value into wrapper Object,kind of Java.
context = context ? Object(context) : window;
@ositowang
ositowang / bindWithParams.js
Created April 3, 2019 17:57
A simple version of bind() in js.
/**
* Concat the parameters passed in when binding and the parameters when the new
* binded function takes
*
* @param {*} context
* @returns
*/
Function.prototype.bindWithParam = function(context) {
// take the function
let fn = this;