JS 有 Math.min()和 Math.max(),为什么就没有 Math.sum()? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
naminokoe
V2EX    Javascript

JS 有 Math.min()和 Math.max(),为什么就没有 Math.sum()?

  •  
  •   naminokoe 2023-08-01 15:09:16 +08:00 4642 次点击
    这是一个创建于 868 天前的主题,其中的信息可能已经有所发展或是发生改变。

    真是令人费解

    26 条回复    2023-08-02 10:14:08 +08:00
    iOCZ
        1
    iOCZ  
       2023-08-01 15:11:44 +08:00
    用 reduce
    laoyutang
        2
    laoyutang  
       2023-08-01 15:35:56 +08:00
    自己加不行么
    Pipecraft
        3
    Pipecraft  
       2023-08-01 16:49:26 +08:00
    假如有 Math.sum(),不一定能减少很多代码吧。

    数据少的情况
    sum = Math.sum(1, 3, 5)
    vs.
    sum = 1 + 3 + 5

    数据多的情况
    const array = [1, 3, 4, ...]

    sum = Math.sum(...array)
    vs.
    sum = array.reduce((acc, v) => acc + v) (效率更高)
    Alias4ck
        4
    Alias4ck  
       2023-08-01 17:02:09 +08:00
    @Pipecraft 数据多为啥后者效率会更高 你计算 sum 不都是要遍历全部元素吗
    libook
        5
    libook  
       2023-08-01 17:18:32 +08:00
    你可以去 https://github.com/tc39/ecma262 提交草案,大家都需要的话就有机会可以进标准。

    Math.min()和 Math.max()是第一版标准就包含了,为啥第一版没加 sum 就无从考证了。

    我个人十年开发经验来看,sum 其实用得真的不多,真要特定场景用得多了就用 reduce 封装个函数也很方便,还没有产生过非要有个 sum 的想法。

    反而像前几年通过的 String.prototype.padStart()、String.prototype.padEnd()特性是真得挺实用的。
    wakarimasen
        6
    wakarimasen  
       2023-08-01 17:22:54 +08:00   5
    在 JS 里面寻找符合直觉的设计是否搞错了什么(
    Pipecraft
        7
    Pipecraft  
       2023-08-01 18:22:30 +08:00
    @Alias4ck #4 sum 函数里面需要遍历一次,array 解构时还有一次性能开销。所以我觉得 reduce 会效率更高一些。
    但没有做实际的性能比较,也有可能是错的。
    hsfzxjy
        8
    hsfzxjy  
       2023-08-01 19:14:52 +08:00 via Android
    @Pipecraft 可以设计成不解构直接传数组啊
    naminokoe
        9
    naminokoe  
    OP
       2023-08-01 19:25:30 +08:00
    @libook #5 python 就能内置 min 、max 、sum
    Pipecraft
        10
    Pipecraft  
       2023-08-01 19:27:32 +08:00
    @hsfzxjy #8 是可以。那 2 个,3 个,4 个等不是很多的数字时,怎么处理呢?
    包装成数组调用的话,也挺麻烦。Math.min, Math.max 的写法更优雅一些吧。
    这点性能开销也不大,要实现 Math.sum ,解构的方式还是好点吧。
    moult
        11
    moult  
       2023-08-01 19:30:41 +08:00   10
    缺德代码:
    let a = [1,2,3,4,5];
    eval(a.join('+'));
    hsfzxjy
        12
    hsfzxjy  
       2023-08-01 19:39:28 +08:00 via Android
    @Pipecraft 那可以直接用+,更直观
    Pipecraft
        13
    Pipecraft  
       2023-08-01 19:52:09 +08:00
    @hsfzxjy #12 所以 3 楼我写了觉得没必要。
    importmeta
        14
    importmeta  
       2023-08-01 19:55:52 +08:00
    我只知道 JS 加法运算不精确, 特别是小数加法, 必须用数学库.
    xuanbg
        15
    xuanbg  
       2023-08-01 22:04:22 +08:00
    都 2023 年了,JS 连长整型都不支持。。。辣鸡
    secondwtq
        16
    secondwtq  
       2023-08-01 23:01:43 +08:00
    不知道楼主学没学过 C ,C 里面是没有内置的 min/max 的,取两个数的最大值需要 a > b ? a : b
    然后有的人喜欢定义一个宏 #define MAX(a, b) a > b ? a : b
    又因为 C 预处理器宏是文本替换,所以这个会有各种坑 ...
    (为什么不定义函数?因为 C 直到 C11 才有个凑数的泛型 ...)

    我看主题里都是假设有个容器,然后在容器里的数取 min/max ,但实际编码时很多时候就是算法需要在固定的数中间取,比如我算出一个 a ,a 可能是负数,我不想返回负数,就用 Math.max(0, a),因为有了这个库函数,所以不需要写 a > 0 ? a : 0 。
    自己去 GitHub 上面搜,用解构取数组 min/max 的反而难找 https://github.com/search?q=Math.max&type=code&p=1

    类似的加法直接用 + 就行了,不需要一个专门的函数
    算是强行找点借口吧 ...
    ChefIsAwesome
        17
    ChefIsAwesome  
       2023-08-01 23:13:33 +08:00 via Android
    为什么没有 Math.average ?令人费解
    IvanLi127
        18
    IvanLi127  
       2023-08-02 03:08:03 +08:00 via Android
    这。。。是想批量提交给运行时提升效率?感觉没啥用啊这函数
    dcsuibian
        19
    dcsuibian  
       2023-08-02 03:22:25 +08:00
    大胆猜测:因为 Java 没有 Math.sum()

    因为 Javascript 的 Date 实现是从 JDK 1.0 里抄来的,所以很难不怀疑 js 的 Math 也抄了
    [Javascript 中的 Date 对象取值 month 为什么是从 0 开始的?]( https://www.zhihu.com/question/263804983)
    Mutoo
        20
    Mutoo  
       2023-08-02 08:00:55 +08:00
    Math.sum(1,"2",3)
    JeffGe
        21
    JeffGe  
       2023-08-02 08:30:42 +08:00 via Android
    你真想要的话可以自己 Polyfill
    ophark
        22
    ophark  
       2023-08-02 09:11:43 +08:00
    @ChefIsAwesome 我也加一个,为什么没有,Math.top(array, 10)求 top10 的数据,狗头保命
    crazyTanuki
        23
    crazyTanuki  
       2023-08-02 09:14:46 +08:00
    确实 Javascript 的原生工具库不太完善,很多东西都不好用,需要引用第三方工具库,不过随着 es 版本迭代,情况好多了
    KMpAn8Obw1QhPoEP
        24
    KMpAn8Obw1QhPoEP  
       2023-08-02 09:19:42 +08:00 via Android
    @moult 谢谢 看吐了
    KMpAn8Obw1QhPoEP
        25
    KMpAn8Obw1QhPoEP  
       2023-08-02 09:21:28 +08:00 via Android
    @xuanbg 您是不是在找:BigInt
    libook
        26
    libook  
       2023-08-02 10:14:08 +08:00
    @naminokoe #9 Python 基本算是编程语言设计标杆了吧,JS 后来有不少特性都是借鉴的 Python 。
    不光有从 Python 来的,还有从 Ruby 、Java (甚至 Java 后来有一些反向借鉴)等其他语言借鉴的新特性,我上面提供的那个链接,很多人提交草案的时候都会顺便提一下从什么语言的哪个特性借鉴的。
    JS 的社区是个非常开放的社区,不像一些语言那样受企业的控制,任何人都可以提交草案,并都有机会成为正式标准。所以如果你需要这个特性,也可以去提一个草案。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2862 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 14:21 PVG 22:21 LAX 06:21 JFK 09:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86