为什么arr.filter(String)也返回数字?

时间:2018-04-06 09:45:23

标签: javascript arrays

我正在做一些小练习来保持我对js怪癖的全新认识。我试着编写一些简单的过滤器,它们返回一个包含某些元素的新数组,它们是字符串,数字,ecc ...而且我很惊讶arr.filter(String)在给定数组中产生的数字也是数字。

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

然后我想知道arr.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中一切都是对象,或者在这种情况下我是对的吗?

顺便说一下,我真的很想了解String过滤器下发生了什么,希望你能帮帮我

3 个答案:

答案 0 :(得分:6)

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

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

  • String("") - > "" - > falsey - >过滤
  • Number("") - > 0 - > falsey - >过滤
  • Number("omg") - > NaN - > falsey - >过滤
  • Object("") - >字符串(“”) - > truthy - >未过滤的

这是使用通用辅助函数实现所需内容的另一种方法,该函数创建与指定类型匹配的谓词函数。

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

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

用法:

onlyString([2, 4, "", "omg", ])
> [ "", "omg" ]

答案 1 :(得分:3)

Array.filter会过滤掉arr值,具体取决于传递的function结果。如果是真的,它将存储在数组中。如果它是假的,它将从数组中删除。

现在,如果您检查String()的结果,Number()& Object(),您会看到过滤掉评估为false的值,例如"", 0, NaN。其他人在阵列中返回。

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


function onlyNumber(arr) {
   return arr.filter(Number);
}
console.log(Number(2), Number(4), Number(""), Number("omg"));
console.log(onlyNumber([2, 4, "", "omg", ]));


function onlyObject(arr) {
   return arr.filter(Object);
}
console.log(Object(2), Object(4), Object(""), Object("omg"));
console.log(onlyObject([2, 4, "", "omg", {}]));

答案 2 :(得分:1)

您可以尝试此操作仅过滤字符串类型

function onlyString(arr) {
    return arr.filter(function (el) {
        return typeof  el == 'string';
    });
 }
 console.log(onlyString([2, 4, "", "omg", ]));