Go to comments

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的一些



Leave a comment 0 Comments.

Leave a Reply

换一张