Lodash Lang语言方法
Lang方法翻译过来是langage语言的意思,
比如检测数据类型和语言相关的,勉强可以认为是语言身上的方法,它不是JS原生的对象,是Lodash自己定义的一个对象
一、强制转为数组
强制转为数组(很粗暴),其实就是在外面加一层方括号
console.log(_.castArray('a')); // ["a"] console.log(_.castArray({a:1, b:2})); // [{a: 1, b: 2}] console.log(_.castArray(null)); // [null]
数组转数组
var array = [1, 2, 3]; console.log(_.castArray(array) === array); // true
二、拷贝
1、浅拷贝
_.clone()
var obj = { a:1, b:{ c:2 } }; var shallow = _.clone(obj); console.log(obj); // {a:1, b:{ c:2 }} console.log(shallow); // {a:1, b:{ c:2 }} console.log(obj.a === shallow.a); // true
浅拷贝复制的只是引用的地址没有赋值。修改对象shallow,对象obj也跟着变了
var obj = { a:1, b:{ c:2 } }; var shallow = _.clone(obj); shallow.b.c = 3, console.log(obj, shallow); // {a:1, b:{ c:3 }} {a:1, b:{ c:3 }}
2、深拷贝
_.cloneDeep()
var obj = { a:1, b:{ c:2 } }; var deep = _.cloneDeep(obj); console.log(obj[0] === deep[0]); // true deep.b.c = 3; console.log(obj); // {a:1, b:{ c:2 }} console.log(deep); // {a:1, b:{ c:3 }}
3、With比较器
_.cloneWith() 这个先跳过
先看一个知识点,下面例子会用到
.cloneNode()方法返回调用该方法的节点的-一个副本。也称为克隆节点/拷贝节点
<ul> <li>1</li> <li>2</li> <li>3</li> </ul> <script> var ul = document.getElementsByTagName("ul")[0]; var cloneLi = ul.children[0].cloneNode(); // console.log(cloneLi); // 拷贝的节点<li></li> ul.appendChild(cloneLi); // ul.lastChild.innerText = '冷雨幽窗不可听'; // 为了看的更清楚,添加一些文字 </script>
如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
如果括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点
_.cloneDeepWith()
with结尾的,多一个比较器参数
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>cloneDeepWith</title> <script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script> </head> <body> <ul> <li>1</li> <li>2</li> <li>3</li> </ul> <script> function customizer(value) { if (_.isElement(value)) { return value.cloneNode(false); } } var el = _.cloneDeepWith(document.body, customizer); console.log(el === document.body); // false console.log(el.nodeName); // 'BODY' console.log(el.childNodes.length); // 0 </script> </body> </html>
1). document.body获取的是body元素节点对象,所以要用customizer判断一下是否是dom原生
2). _.isElement(value)判断是否是dom元素,如果是dom元素,就浅拷贝一份过去
3). 用的是cloneNode浅拷贝,不拷贝的body里面的内容,所以body是空的(如果值是false结果就不一样了)
三、检测对象属性值是否满足条件
_.conformsTo()
通过第二个参数来检测对象的属性值是否满足某一个条件
var object = { 'a': 1, 'b': 2 }; var object = { 'a': 1, 'b': 2 }; // 检测属性b的值,是否大于1 console.log(_.conformsTo(object, {'b':function(n){ return n > 1;}})); // true // 检测属性b的值,是否大于2 console.log(_.conformsTo(object, {'b':function(n){ return n > 2;}})); // false
第一个参数是要检测的原对象
第二个参数是对象的形式,
1). key是原对象的b,值是一个function函数,
2). 形参n代表对象的b的值
3). 对比
四、比较
_.eq()
比较两个值是否相等。与Object.is()这个方法一样
// 原始值之间比较是相等的 console.log(_.eq(12, 12)); // true // 引用值地址不同,所以不相等 console.log(_.eq({'a':1}, {'a':1})); // false // 原来数字类型的奇葩NaN自己都不等于自己,eq方法做了一下改良,修正了一下NaN是相等的,让NaN变的正常一点 console.log(_.eq(NaN, NaN)); // true
_.gt()
第一个值是否大于第二个值
console.log( _.gt(3, 1), //true _.gt(3, 3), //false );
_.gte()
第一个值是否大于等于第二个值
console.log(_.gte(3, 3)); // true
_.lt()
小于
_.lte()
小于等于
五、检测数据类型
这一堆的方法是用来检测数据类型的,只不过Lodash把检测数据类型做的更加丰富,而且更加的精准了,其实用的是原生JS中toString方法
_.isArguments
_.isArray
_.isArrayBuffer
_.isArrayLike
_.isArrayLikeObject
_.isBoolean
_.isBuffer
_.isDate
_.isElement
_.isEmpty
_.isEqual
_.isEqualWith
_.isError
_.isFinite
_.isFunction
_.isInteger
_.isLength
_.isMap
_.isMatch
_.isMatchWith
_.isNaN
_.isNative
_.isNil
_.isNull
_.isNumber
_.isObject
_.isObjectLike
_.isPlainObject
_.isRegExp
_.isSafeInteger
_.isSet
_.isString
_.isSymbol
_.isTypedArray
_.isUndefined
_.isWeakMap
_.isWeakSet
_.isArray()
检测数据是不是数组
console.log(_.isArray([1, 2, 3])); // true
document.body.children获取到页面中body节点下的所有的子元素的,获取到的是类数组,准确来讲是HTMLCollection集合对象,这样检测返回false
console.log(_.isArray(document.body.children)); // false
_.isObject()
检测数据是不是对象
console.log(_.isObject({})); // true
null用原生typeof方法检测的是object,这里修正了一下返回的是false
console.log(_.isObject(null)); // false
六、转换
to的意思是用来转换的
_.toArray
_.toFinite
_.toInteger
_.toLength
_.toNumber
_.toPlainObject
_.toSafeInteger
_.toString
_.toArray()
转换数组的(比上面castArray强制转数组智能)
// 把对象的value取出来组成数组 console.log(_.toArray({a:1, b:2})); // [1, 2] // 字符串转数组 console.log(_.toArray('abc')); // ["a", "b", "c"] // 转不了变成空数组 console.log(_.toArray(null)); // []
PS:
Math和Number对象都是原生JS的一些