防冲突
underscore使用 _ 作为函数的挂载对象,如果页面中已经存在了 _ 对象,underscore就会覆盖对象
1 | var _ = {value: 1}; |
所以underscore提供了noConflict功能,可以放弃underscore的控制变量 _ ,返回underscore对象的引用
1 | var _ = {value: 1}; |
那么noConflict函数是如何实现的呢?
首先,在underscore执行的时候,会存储之前的 _ 对象,然后当执行noConflict函数的时候,再将之前存储的 _ 对象赋给全局对象,最后返回 underscore对象。这样,我们就可以利用返回的underscore对象使用underscore提供的各种方法。
1 | // 源码一开始的时候便储存之前的 _ 对象 |
_.identity
这是underscore的一个功能函数
1 | // Keep the identity function around for default iteratees. |
如果我们自己编写一个 _.map
函数:
1 | _.map = function(arr, iteratee) { |
然而当我们这样使用 _.map([1,2,3])
时便会报错,因为我们没有传入iteratee函数,然而使用underscore却没有问题,结果时返回一个相同的新数组,原因就在于当iteratee为undefined的时候,underscore视为传入了 _.identity
函数。就相当于:
1 | _.map = function(arr, iteratee) { |
简而言之,如果我们想要复制一个数组:
var cloneArr = [1, 2, 3].map(_.identity) // [1,2,3]
_.constant
1 | // Predicate-generating functions. Often useful outside of Underscore. |
该函数传入一个value,然后返回一个函数,该函数返回的就是传入的value,这样做的意义是什么呢?
1 | var value = 1; |
这个很容易让人想到 es6 的const,但其实并不是,它和下面的 _.noop 函数一样可以作为默认函数使用。
1 | _.select(collection, filterFunction || function(){ return true; }) |
我们根据filterFunction筛选collection中符合条件的元素,如果没有传filterFunction,我们就返回所有的元素,如果有 _.constant
函数,我们可以将其简化为:
1 | _.select(collection, filterFunction || _.constant(true)) |
尽管没有太大的变化,但是语义更加明确
_.noop
1 | _.noop = function(){} |
一个空函数,看起来依旧没有什么用…
noop函数可以用于作为默认值,这样就可以省去是否存在的判断了,如:
1 | // 不使用 noop |
deepGet
1 | var deepGet = function(obj, path) { |
deepGet用于获得对象深层次的值
1 | var obj = { |
使用这个函数,可以避免深层次取值时,因为没有其中一个属性,导致的报错
shallowPropety
1 | var shallowPropety = function(value) { |
shallowProperty也是用于获取对象的属性,在开发中我们通常都会直接使用 . 来获取对象的属性,为什么这里要多此一举呢?
1 | // 获取 arr 所有元素的 name 属性 |
_.property
1 | _.property = function(path) { |
_.property 结合了 deepGet 和 shallowProperty,可以获取元素深层次的值,上面一个列子也可以写成:
1 | var names = arr.map(_.property('name')); |
_.propertyOf
1 | _.propertyOf = function(obj) { |
_.property
返回一个函数,这个函数返回任何传入的对象的指定属性。
_.propertyOf
与 _.property
相反,需要一个对象,并返回一个函数,这个函数将返回一个提供的属性的值。
1 | // 获取 person 对象的所有属性值 |
_.random
返回一个 min 和 max 之间的随机整数,如果你只传递一个参数,那么将返回0和这个参数之间的整数。
1 | _.random = function(min, max) { |