V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
Bechbaliq
V2EX  ›  JavaScript

不懂就问,对数组操作时,返回所有真值用 testArray.map(Boolean) 是什么写法

  •  
  •   Bechbaliq · 2021-08-24 15:36:27 +08:00 · 1606 次点击
    这是一个创建于 1183 天前的主题,其中的信息可能已经有所发展或是发生改变。
    没懂为啥括号里 Boolean 是怎么来的,是什么的简写还是其他语法特性,能不能给个出处
    14 条回复    2021-08-25 10:35:59 +08:00
    1sm23
        1
    1sm23  
       2021-08-24 15:39:12 +08:00
    不应该是 Array.prototype.filter 吗
    momocraft
        2
    momocraft  
       2021-08-24 15:39:23 +08:00   ❤️ 1
    Boolean 是一个函数 你在 repl 里执行一次就知道了
    Puteulanus
        3
    Puteulanus  
       2021-08-24 15:40:58 +08:00   ❤️ 1
    就是 new Boolean() 那个 Boolean 吧
    zhw2590582
        4
    zhw2590582  
       2021-08-24 15:43:28 +08:00   ❤️ 1
    [0, '', false, null, NaN].filter(Boolean)

    等价于----------------------------------------

    [0, '', false, null, NaN].filter(item => Boolean(item))
    clf
        5
    clf  
       2021-08-24 15:46:18 +08:00   ❤️ 1
    supuwoerc
        6
    supuwoerc  
       2021-08-24 15:46:45 +08:00   ❤️ 1
    这句话的意思是过滤虚值,我经常这样处理,类似的还可以
    ```
    array.map(Number)
    array.map(String)
    ```
    Boolean,String 都是一个包装函数,传入 map 就是指定 map 处理逻辑。
    Leviathann
        7
    Leviathann  
       2021-08-24 16:01:20 +08:00 via iPhone
    一个 object 的 get 方法有没有简写
    类似 Java 的方法引用 xxxMap::get 那种
    Bechbaliq
        8
    Bechbaliq  
    OP
       2021-08-24 16:06:07 +08:00
    明白了,换成这种写法我就懂了:
    var x = [0, 1, 0, 0].map(positive);
    var positive = (x) => new Boolean(x);

    map 里的 positive 是一个函数,可以直接替换成 Boolean.
    DICK23
        9
    DICK23  
       2021-08-24 17:38:57 +08:00   ❤️ 1
    Boolean 就是个构造函数,蕾丝与 i => !!i
    shyling
        10
    shyling  
       2021-08-24 17:40:38 +08:00   ❤️ 1
    Boolean 是个函数
    Mexion
        11
    Mexion  
       2021-08-24 17:49:32 +08:00   ❤️ 1
    Boolean 是一个函数,map 会将遍历的元素逐个传进这个函数
    mxT52CRuqR6o5
        12
    mxT52CRuqR6o5  
       2021-08-24 17:53:33 +08:00   ❤️ 1
    @Bechbaliq
    Boolean(x)和 new Boolean(x)不一样
    Bechbaliq
        13
    Bechbaliq  
    OP
       2021-08-24 18:32:14 +08:00 via Android
    @mxT52CRuqR6o5 嗯嗯,上面那个 MDN 文档提到了,感谢指出
    libook
        14
    libook  
       2021-08-25 10:35:59 +08:00   ❤️ 3
    JS 是弱类型语言,可以参考“鸭子类型”的理论。

    你以后遇到类似的问题,可以按照如下步骤来探究:
    (一)
    疑问在于 map 方法的参数上,所以可以去 MDN 上看 Array.prototype.map 方法的参数是什么: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map
    可以看到 map 有 2 个参数,你的例子只传了第一个参数,也就是 map 的 callback 参数,map 会往 callback 函数里传三个参数,也就是说 Boolean 函数会接收到 map 传进来的三个参数。
    不要被 Boolean 这个名字迷惑到,给 map 传任何 callback 都是这样的写法,你自己写一个 funcA,也是同样的写法传给 map,如 testArray.map(funA),JS 里名称的大小写没有特殊的特性区别。
    (二)
    看看 Boolean 是什么,同样去 MDN 上查: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Boolean
    看来 Boolean 本身是一个函数,只有一个参数,会返回一个布尔型数据。(而且文档也特意说明了,Boolean 函数和 Boolean 构造函数是两回事,特性不一样,所以换成 new Boolean 会得到不一样的结果)
    (三)
    所以 map 传给 Boolean 函数的三个参数中,Boolean 函数只会用到第一个,也就是 callback 数组中正在处理的当前元素。
    Boolean 会将这个参数转换成一个布尔型数据返回给 map 。
    (四)
    回过头来看 map 的文档,看看 map 是如何处理 callback 返回的数据的,“callback 每次执行后的返回值(包括 undefined )组合起来形成一个新数组。”
    那么结果就很清晰了:map 方法会把数组中的每个元素拿出来传给 Boolean 函数,转换成布尔型数值,然后把结果组成一个新数组。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5305 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:31 · PVG 17:31 · LAX 01:31 · JFK 04:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.