You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Fill in a given object with default properties.// 扩展目标对象,但是禁止扩展修改目标对象已经存在的属性键值对_.defaults=createAssigner(_.allKeys,true);// Extend a given object with all the properties in passed-in object(s).// 扩展目标对象,对于源对象及其原型链中所有可枚举属性对目标对象进行扩展修改_.extend=createAssigner(_.allKeys);// Assigns a given object with all the own properties in the passed-in object(s).// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)// 扩展目标对象,对于源对象仅获取自身可枚举属性扩展修改目标对象,但是源对象原型链属性不进行扩展修改_.extendOwn=_.assign=createAssigner(_.keys);
underscore对象浅拷贝核心
核心函数:
createAssigner()
源码:
实例:
解析:
_.extend
执行中keysFunc
为_.allKeys
方法,返回的是对象本身及其原型链上所有可枚举属性名组成的数组;执行createAssigner
方法,在上例中目标对象为{age: 18}
,arguments.length
为2
,defaults
为undefined
;继续往下执行,length == 2 && obj != null
;继续往下执行,开始依次循环源对象,因源对象从第二个参数开始,所以index
取值从1
开始,在循环内部,获取源对象source
,执行keysFunc
方法获取source
自身和原型上所有属性组成的数组,得到属性个数l
;依次循环属性数组,!defaults
始终为true
,始终执行obj[key]=source[key]
向目标对象赋值操作_.extendOwn
和_.extend
方法唯一不同的就是keysFunc
函数,在_.extendOwn
中,keysFunc
为_.keys
方法,返回的是对象自身所有可枚举属性组成的数组,剩下的都和_.extend
方法一样_.defaults
执行和上面两个都略有区别:在_.defaults
中createAssigner
函数中keysFunc
函数为_.allKeys
方法,defaults
置为true
;执行createAssigner
方法,第一步获取传入对象个数;因为defaults
始终为true
,第二步执行Object
包装,此处可以兼容如果传入obj
为空或者null
的情况;如果参数个数<2
则直接返回目标对象【注:此时obj
不可能为null
,因为即使原始传入的obj
为null
,经过上一步操作,null
也会转换为Object
对象】;往下和_.extend
方法一样,依次执行外层循环、内层循环,在内层循环的最后,因为!defaults
始终为false
,此处就是判断,如果obj[key] === void 0
则赋值,否则如果该属性已经存在目标对象中,则不进行任何操作The text was updated successfully, but these errors were encountered: