章
目
录
咱写代码的时候,经常会碰到要判断一个数组里有没有某个特定元素的情况,JavaScript里有两个方法都能干这事儿,一个是Lodash库的_.includes
,另一个是原生的Array.prototype.includes
。这俩看着功能差不多,都是检查是否包含某个值,但实际上在好多方面都有挺大区别,今天就来好好唠唠,以后别再傻傻分不清了。
一、先搞清楚核心差异在哪
这俩方法的核心区别主要体现在适用范围、参数顺序、对对象和字符串的处理方式,还有兼容性上。咱通过下面这个表格,能更直观地对比一下。
适用范围
特性 | Lodash _.includes | 原生Array.includes |
---|---|---|
适用范围 | 支持数组、对象、字符串 | 仅限数组 |
参数顺序 | _.includes(collection, value, fromIndex=0) | array.includes(value, fromIndex=0) |
对象处理 | 可以检查对象中是否包含某个键值对(不过得自己写点逻辑) | 不支持对象 |
字符串处理 | 能直接检查子字符串(比如_.includes('abc','b') ) |
只能用于数组,要是处理字符串,得先把字符串转成数组 |
兼容性 | 兼容所有浏览器(连老古董IE都没问题) | 在ES6+环境才能用(IE11+部分支持) |
这么一看,差距是不是就很明显啦?Lodash的_.includes
适用范围更广,原生的Array.includes
就比较专一,只对数组“情有独钟”。
二、实际场景里它们表现咋样?
咱光看理论还不够,得来点实际代码示例,这样理解起来更轻松。
1. 检查数组元素
// Lodash检查数组是否包含指定元素
_.includes([1, 2, 3], 2); // true
// 原生方法检查数组是否包含指定元素
[1, 2, 3].includes(2); // true
从这段代码能看出来,在检查数组元素的时候,这俩方法返回的结果是一样的。不过要是你的项目得兼容老版本浏览器,那Lodash的_.includes
就更靠谱点。
2. 从指定索引位置开始检查
// Lodash从指定索引(第三个参数)开始检查数组是否包含指定元素
_.includes([1, 2, 3, 2], 2, 2); // true(从索引2开始检查)
// 原生方法从指定索引开始检查数组是否包含指定元素
[1, 2, 3, 2].includes(2, 2); // true
虽然它们的参数设计不太一样,但最终实现的功能是一样的,都是从指定索引位置开始找目标元素。
3. 检查对象(Lodash特有技能)
原生的Array.includes
是没办法直接检查对象的,Lodash的_.includes
在这方面就很给力。
const obj = { a: 1, b: 2 };
// 检查对象里是否包含某个值
_.includes(obj, 1); // true(检查值是否存在)
_.includes({ 'a': 1 }, 1); // true
// 检查对象里是否包含某个键值对(这里得结合其他方法)
_.includes(_.toPairs(obj), ['a', 1]); // true(先把对象转成键值对数组)
比如说,咱想知道对象里有没有某个特定的值,或者某个键值对,用Lodash的_.includes
就能轻松搞定。
4. 检查字符串(Lodash更简单粗暴)
// Lodash直接检查字符串中是否包含指定子字符串
_.includes('hello', 'e'); // true
// 原生方法检查字符串中是否包含指定子字符串,得先操作字符串或转成数组
'hello'.indexOf('e')!== -1; // true
Array.from('hello').includes('e'); // true(这种方式又复杂又不高效)
从代码里能看出来,用原生方法检查字符串里有没有某个子字符串,要么用indexOf
方法判断,要么先把字符串转成数组再用includes
,相比之下,Lodash的_.includes
就简洁多了。
三、性能咋样?啥场景该用谁?
选方法的时候,性能也是个重要因素。一般来说,原生的Array.includes
在处理纯数组的时候性能更好,毕竟它是JavaScript自带的,不用额外引入别的库。要是你的项目环境支持ES6+,而且只需要处理数组,那就用原生的Array.includes
,又快又方便。
但要是你的项目得兼容老浏览器,或者需要处理对象、字符串,再或者想用Lodash的链式操作,让代码写起来更流畅,那Lodash的_.includes
就是更好的选择。
下面再总结一下不同场景下推荐使用的方法:
场景 | 推荐方法 | 原因 |
---|---|---|
仅需检查数组元素 | Array.includes | 原生方法性能更优,还不用引入库 |
兼容旧浏览器 | _.includes | 能解决原生方法兼容性不足的问题 |
处理对象或字符串 | _.includes | 原生方法不支持直接处理 |
需要链式调用(Lodash链) | _.includes | 和Lodash其他方法搭配起来更顺畅 |
四、最后总结一下
简单来说,要是项目环境比较新,只涉及数组处理,那就优先用原生的Array.includes
,又高效又简洁。要是有兼容旧浏览器的需求,或者要处理对象、字符串,还想玩Lodash链式操作,那就选Lodash的_.includes
,它能满足更多复杂场景的需求。
希望看完这篇文章,大家以后在选_.includes
还是Array.includes
的时候,心里都能有本明白账,写代码也能更顺溜!