zoukankan      html  css  js  c++  java
  • 纯原生仿ES6的Object.assign,实现深度合并对象

    源码:

    function isObj(x){	
    	var type = typeof x;
    	return x !== null && (type === 'object' || type === 'function');
    }
    
    var hasOwnProperty = Object.prototype.hasOwnProperty;
    var propIsEnumerable = Object.prototype.propertyIsEnumerable;
    
    function toObject(val) {
    	if (val === null || val === undefined) {
    		throw new TypeError('Cannot convert undefined or null to object');
    	}
    
    	return Object(val);
    }
    
    function assignKey(to, from, key) {
    	var val = from[key];
    
    	if (val === undefined || val === null) {
    		return;
    	}
    
    	if (hasOwnProperty.call(to, key)) {
    		if (to[key] === undefined || to[key] === null) {
    			throw new TypeError('Cannot convert undefined or null to object (' + key + ')');
    		}
    	}
    
    	if (!hasOwnProperty.call(to, key) || !isObj(val)) {
    		to[key] = val;
    	} else {
    		to[key] = assign(Object(to[key]), from[key]);
    	}
    }
    
    function assign(to, from) {
    	if (to === from) {
    		return to;
    	}
    
    	from = Object(from);
    
    	for (var key in from) {
    		if (hasOwnProperty.call(from, key)) {
    			assignKey(to, from, key);
    		}
    	}
    
    	if (Object.getOwnPropertySymbols) {
    		var symbols = Object.getOwnPropertySymbols(from);
    
    		for (var i = 0; i < symbols.length; i++) {
    			if (propIsEnumerable.call(from, symbols[i])) {
    				assignKey(to, from, symbols[i]);
    			}
    		}
    	}
    
    	return to;
    }
    
    function deepAssign(target) {
    	target = toObject(target);
    
    	for (var s = 1; s < arguments.length; s++) {
    		assign(target, arguments[s]);
    	}
    
    	return target;
    };
    

      

    调用:

    deepAssign({a: {b: 0}}, {a: {b: 1, c: 2}}, {a: {c: 3}});
    //=> {a: {b: 1, c: 3}}
    

      

  • 相关阅读:
    oracle Constraint[相似 constraint使用方法总结 I]
    四个好看的CSS样式表格
    自己动手写操作系统--个人实践
    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
    海量数据存储
    windows的定时任务设置
    人脸识别算法初次了解
    Java替代C语言的可能性
    二叉排序树
    海量数据处理面试题集锦
  • 原文地址:https://www.cnblogs.com/wln3344/p/5601556.html
Copyright © 2011-2022 走看看