30 lines
		
	
	
		
			621 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			30 lines
		
	
	
		
			621 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| function klona(val) {
 | |
| 	var k, out, tmp;
 | |
| 
 | |
| 	if (Array.isArray(val)) {
 | |
| 		out = Array(k=val.length);
 | |
| 		while (k--) out[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;
 | |
| 		return out;
 | |
| 	}
 | |
| 
 | |
| 	if (Object.prototype.toString.call(val) === '[object Object]') {
 | |
| 		out = {}; // null
 | |
| 		for (k in val) {
 | |
| 			if (k === '__proto__') {
 | |
| 				Object.defineProperty(out, k, {
 | |
| 					value: klona(val[k]),
 | |
| 					configurable: true,
 | |
| 					enumerable: true,
 | |
| 					writable: true,
 | |
| 				});
 | |
| 			} else {
 | |
| 				out[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;
 | |
| 			}
 | |
| 		}
 | |
| 		return out;
 | |
| 	}
 | |
| 
 | |
| 	return val;
 | |
| }
 | |
| 
 | |
| exports.klona = klona; |