为什么 are.filter(String) 也返回数字? [复制]

2024-04-26

我正在做一些小练习来保持我对 js 怪癖的了解。我尝试编写一些简单的过滤器,它返回一个新数组,其中包含某些元素,例如字符串、数字、ecc ...,当给定数组中也有数字时,我对 arr.filter(String) 产生的结果感到惊讶。

function onlyString(arr) {
  return arr.filter(String);
}
onlyString([2, 4, "", "omg", ]) // returns [2, 4, "omg"]

然后我想看看 air.filter(Number) 会返回什么

function onlyString(arr) {
  return arr.filter(Number);
}
onlyString([2, 4, "", "omg", ]) // returns [2, 4]

另外,我在 arr 中添加了一个空对象,看看会发生什么:

function onlyString(arr) {
  return arr.filter(Object);
}
onlyString([2, 4, "", "omg", {}]) // returns [2, 4, "", "omg", {}]

乍一看,我更困惑,但后来我认为返回数组是正确的,因为在 js 中一切都是对象,或者我在这种情况下是对的?

顺便说一句,我真的很想了解字符串过滤器的幕后发生了什么,希望你能帮助我


您传递给的函数.filter不是“这是一个实例”谓词,它们是这些类型的实际构造函数。

因此,如果该构造函数接受给定值并返回一个新创建的“真实”对象作为响应,它将保留在返回的列表中,例如

  • String("") -> ""-> 错误 -> 过滤
  • Number("") -> 0-> 错误 -> 过滤
  • Number("omg") -> NaN-> 错误 -> 过滤
  • Object("")-> String("") -> true -> 未过滤

这是使用通用辅助函数来实现您想要的功能的另一种方法,该函数创建与指定类型匹配的谓词函数。

function is(type) {
    return function(o) {
        return Object(o) instanceof type;
    }
}

function onlyString(array) { return array.filter(is(String)) };

usage:

onlyString([2, 4, "", "omg", ])
> [ "", "omg" ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 are.filter(String) 也返回数字? [复制] 的相关文章

随机推荐