我正在做一些小练习来保持我对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过滤器下发生了什么,希望你能帮帮我
答案 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", ]));