【问题标题】:Does Javascript filter() perform type coercion by default?Javascript filter() 默认情况下是否执行类型强制?
【发布时间】:2016-05-19 07:12:24
【问题描述】:

我知道 Javascript 类型强制(== vs ===)。

我正在查看 filter() 函数。似乎它默认执行类型强制。它是否正确?代码如下:

var x = [1,2,'hi']

console.log(x.filter(String)); // [ 1, 2, 'hi' ]
console.log(x.filter(Number)); // [ 1, 2]

如果我不希望出现这种情况,我是否必须向过滤器函数添加回调?我很惊讶它以目前的形式工作,因为我认为它总是需要一个回调参数。

【问题讨论】:

  • filter() 应该保留回调返回真实值的元素。您的测试结果反映了这一点。需要参数是什么意思? String()Number() 函数都带有一个参数...
  • 看起来,至少乍一看,确实如此。在这种情况下,String 和 Number 是回调,作为 String(1/2/"hi") 运行。 String("hi") == true 返回 false,但是 !!String("hi") 返回 true。但是不确定这在实现方面意味着什么,但看起来它通过函数运行值,然后将结果强制为布尔值。
  • 啊啊啊。我不知道String和Number实际上是函数
  • 或者至少我没有想到,尽管查看代码以及 filter() 的工作原理,我想这应该很明显
  • 请看0x.filter(Number) --> false!

标签: javascript filter type-coercion


【解决方案1】:

如果可以转换,StringNumber 全局对象将转换。 the LINK

它说,

“任何要转换为字符串的东西。”

关于NumberLINK

如果参数不能转换为数字,则返回 NaN

NaN 被取为假,

【讨论】:

    【解决方案2】:

    您的代码不会检查元素是字符串还是数字。它的作用是这样的:

    String(1) 返回'1' =>truthy => 通过过滤器。
    Number('hi') 返回NaN => falsy => 不通过过滤器。

    你想做的事情可以用一个函数来实现:

    function checkString(el) {
        return (typeof el === 'string');
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多