filter(x => !!x)与filter(x => !!x && x)是否等价的技术疑问
filter(x => !!x)与filter(x => !!x && x)是否等价的技术疑问
嘿,这个问题问得挺细致的,咱们一步步拆解清楚这俩表达式的逻辑,就明白为啥结果一样啦~
首先得搞懂!!x到底在干啥:它是把任意类型的变量x,强制转换成布尔值的小技巧。举个例子:
- 假值(比如
null、undefined、0、''、NaN)经过!!转换后都会变成false - 真值(比如非空字符串、非零数字、对象、数组)转换后都会变成
true
再看!!x && x这个表达式,得回忆一下JS里逻辑与(&&)的特性:它是「短路求值」的——如果左边的表达式为false,直接返回左边的值;如果左边为true,就返回右边的值。那结合!!x的逻辑来看:
- 当x是假值时,
!!x是false,所以!!x && x直接返回false - 当x是真值时,
!!x是true,所以!!x && x会返回x本身
那filter函数的核心逻辑是什么?它只关心回调函数返回值的布尔等价性——不管你返回的是布尔值、数字还是字符串,只要这个值转成布尔后是true,就保留当前元素;是false就过滤掉。
现在对比两个回调的过滤效果:
- 用
x => !!x时:直接返回x的布尔转换结果,假值过滤,真值保留 - 用
x => !!x && x时:假值情况下返回false(过滤),真值情况下返回x本身(x是真值,转布尔后还是true,保留)
所以不管用哪个回调,最终filter输出的结果完全一样!
不过从代码简洁性来说,filter(x => !!x)已经足够清晰了,甚至还能更简化成filter(Boolean)——因为Boolean构造函数本身就相当于x => !!x,用起来更顺手~
备注:内容来源于stack exchange,提问作者essa123
相关产品推荐
相关产品推荐

