underscore是一个JavaScr【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netipt函数库,在不对JavaScript【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】本身进行扩展的基础上提供了一些惯用操作,【转载请注明来源】著作权归作者所有,禁止商业用途转载。用来处理JavaScript原生并不提供【原创不易,请尊重版权】【未经授权禁止转载】的功能。其中在合并对象object的时候【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net,我们经常会用到extend, merg著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】e,那么它们之间到底有什么区别呢?
【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】使用方法对比【关注微信公众号:wwwtangshuangnet】
【作者:唐霜】【本文受版权保护】原创内容,盗版必究。其实我们要对比的,是5个方法,在最新的u未经授权,禁止复制转载。【未经授权禁止转载】nderscore中,新增了assign转载请注明出处:www.tangshuang.net【转载请注明来源】In,下文会说到。这里是3.10.1版本【版权所有,侵权必究】转载请注明出处:www.tangshuang.net。
原创内容,盗版必究。原创内容,盗版必究。【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net_.merge(object, [sources], [customizer], [thisArg]) _.assign(object, [sources], [customizer], [thisArg]) _.extend(object, [sources], [customizer], [thisArg]) _.defaults(object, [sources])_.defaultsDeep(object, [sources])
相同之处转载请注明出处:www.tangshuang.net
【转载请注明来源】未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】- 都不能像你想要的一样处理数组array【关注微信公众号:wwwtangshuangnet】 【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。【作者:唐霜】
_.extend是【作者:唐霜】_.assign的别名,所以其实它们是一样的(在4.0版【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】本之后提供了_.assignIn方法,用以表达“继承”这个概念,_.ex【原创不易,请尊重版权】【作者:唐霜】tend变成了_.assignIn的别名【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。) 【未经授权禁止转载】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。
- 它们都会改变第一个参数object,也就转载请注明出处:www.tangshuang.net【本文受版权保护】是说执行完后,第一个参数object在内本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net存中会改变 【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【转载请注明来源】【本文首发于唐霜的博客】
不同之处【原创内容,转载请注明出处】
原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【转载请注明来源】_.defaults和转载请注明出处:www.tangshuang.net_.defaultsDeep处理参数时,是反向处理的,也就是先读取后转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net面的参数,然后往前推,但是最终被修改的,【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。还是第一个参数 转载请注明出处:www.tangshuang.net【未经授权禁止转载】原创内容,盗版必究。
_.merge和【版权所有】唐霜 www.tangshuang.net_.defaultsDeep会深处理,也就是顶级元素相同的情况下,会著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。一层一层的比较子元素,而其他的只会比较顶【作者:唐霜】【本文受版权保护】级元素,如果顶级元素有一点不同,就直接处【版权所有,侵权必究】原创内容,盗版必究。理掉 转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【作者:唐霜】
- 只有【版权所有】唐霜 www.tangshuang.net
_.extend/_.assign会把undefined作为处理后的值,其本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。他的遇到undefined时,直接跳过这著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net个项,往后继续处理 【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】
案例说明【未经授权禁止转载】
【作者:唐霜】【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】转载请注明出处:www.tangshuang.net如果只有一层,它们的处理方式是差不多的。
【本文受版权保护】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。_.assign({}, { a: 'a' }, { a: 'bb' }) // => { a: "bb" }
_.merge({}, { a: 'a' }, { a: 'bb' }) // => { a: "bb" }
_.defaults({}, { a: 'a' }, { a: 'bb' }) // => { a: "a" }
_.defaultsDeep({}, { a: 'a' }, { a: 'bb' }) // => { a: "a" }
看看_.defauts和_.defaul【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.nettsDeep。
转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【转载请注明来源】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。_.extend({},{a:'1'},{a:'2'}); // => {a:'2'}
_.defaults({},{a:'1'},{a:'2'}); // => {a:'1'} 因为default是反着来的,从后面的参数往前推,_.defaultsDeep道理一样
_.assign/_.extend遇到u【转载请注明来源】本文作者:唐霜,转载请注明出处。ndefined也会使用,而其他的会跳过【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net。
原创内容,盗版必究。未经授权,禁止复制转载。【本文受版权保护】【转载请注明来源】著作权归作者所有,禁止商业用途转载。_.assign({}, { a: 'a' }, { a: undefined }) // => { a: undefined },_.extend一样,因为是别名嘛
_.merge({}, { a: 'a' }, { a: undefined }) // => { a: "a" }
_.defaults({}, { a: undefined }, { a: 'bb' }) // => { a: "bb" }
_.defaultsDeep({}, { a: undefined }, { a: 'bb' }) // => { a: "bb" }
_.merge和_.defaultsDe本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】ep会深入到内部去进行对比。
【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。_.assign({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "b": "bb" }}
_.merge({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a","b":"bb" }}
_.defaults({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a" }}
_.defaultsDeep({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a", "b": "bb" }}
它们都不能用来对比数组,数组的内部结构无【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net法被对比。
【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【本文受版权保护】【原创内容,转载请注明出处】_.assign({}, {a:['a']}, {a:['bb']}) // => { "a": [ "bb" ] }
_.merge({}, {a:['a']}, {a:['bb']}) // => { "a": [ "bb" ] }
_.defaults({}, {a:['a']}, {a:['bb']}) // => { "a": [ "a" ] }
_.defaultsDeep({}, {a:['a']}, {a:['bb']}) // => { "a": [ "a" ] }
有一点需要解释,数组也是object,只本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】不过是特殊的object,也就是键名为数【转载请注明来源】【版权所有,侵权必究】字的按顺序排列的object,所以上面这未经授权,禁止复制转载。【作者:唐霜】条规则只是告诉我们不能对比数组的内部结构【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】,但是可以用来深拷贝数组。你可以这样理解原创内容,盗版必究。【转载请注明来源】,数组的键名是隐形的,但是还是可以一一对未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。应。
本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。本文作者:唐霜,转载请注明出处。var newArray = _.extend([],['a','b'],['c']); // => ['c','b'] 键名为0的属性值被替换
因此,你不可以用其中任何一个方法作为合并【本文受版权保护】【版权所有,侵权必究】数组的方法来使用,比如,你想合并{a:[【本文受版权保护】转载请注明出处:www.tangshuang.net‘aa’]}和{【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。a:[‘bb’]【转载请注明来源】【关注微信公众号:wwwtangshuangnet】}得到{a:[‘aaR转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net17;,’bb’未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】]},这是不可能直接实现的。数组处理,请【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。使用JavaScript原生的数组处理方【本文受版权保护】未经授权,禁止复制转载。法来处理。
【作者:唐霜】【版权所有,侵权必究】
所有的方法都是第一个参数被处理,该对象转载请注明出处:www.tangshuang.net【本文受版权保护】原始数据会被改变(同时被用作返回值返回)【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。。
a={a:'a'}; _.assign(a, {b:'bb'}); // a => { a: "a", b: "bb" }
a={a:'a'}; _.merge(a, {b:'bb'}); // a => { a: "a", b: "bb" }
a={a:'a'}; _.defaults(a, {b:'bb'}); // a => { a: "a", b: "bb" }
a={a:'a'}; _.defaultsDeep(a, {b:'bb'}); // a => { a: "a", b: "bb" }
注:本文根据【原创内容,转载请注明出处】这个问题本文版权归作者所有,未经授权不得转载。中的回答编写。未经授权,禁止复制转载。
【作者:唐霜】未经授权,禁止复制转载。未经授权,禁止复制转载。2016-08-30 5335 underscore


