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

2023-08-01 15:09:16 +08:00
 naminokoe

真是令人费解

3980 次点击
所在节点    JavaScript
26 条回复
iOCZ
2023-08-01 15:11:44 +08:00
用 reduce
laoyutang
2023-08-01 15:35:56 +08:00
自己加不行么😓
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
2023-08-01 17:02:09 +08:00
@Pipecraft 数据多为啥后者效率会更高 你计算 sum 不都是要遍历全部元素吗
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()特性是真得挺实用的。
angrylid
2023-08-01 17:22:54 +08:00
在 JS 里面寻找符合直觉的设计是否搞错了什么(
Pipecraft
2023-08-01 18:22:30 +08:00
@Alias4ck #4 sum 函数里面需要遍历一次,array 解构时还有一次性能开销。所以我觉得 reduce 会效率更高一些。
但没有做实际的性能比较,也有可能是错的。
hsfzxjy
2023-08-01 19:14:52 +08:00
@Pipecraft 可以设计成不解构直接传数组啊
naminokoe
2023-08-01 19:25:30 +08:00
@libook #5 python 就能内置 min 、max 、sum
Pipecraft
2023-08-01 19:27:32 +08:00
@hsfzxjy #8 是可以。那 2 个,3 个,4 个等不是很多的数字时,怎么处理呢?
包装成数组调用的话,也挺麻烦。Math.min, Math.max 的写法更优雅一些吧。
这点性能开销也不大,要实现 Math.sum ,解构的方式还是好点吧。
moult
2023-08-01 19:30:41 +08:00
缺德代码:
let a = [1,2,3,4,5];
eval(a.join('+'));
hsfzxjy
2023-08-01 19:39:28 +08:00
@Pipecraft 那可以直接用+,更直观
Pipecraft
2023-08-01 19:52:09 +08:00
@hsfzxjy #12 所以 3 楼我写了觉得没必要。
importmeta
2023-08-01 19:55:52 +08:00
我只知道 JS 加法运算不精确, 特别是小数加法, 必须用数学库.
xuanbg
2023-08-01 22:04:22 +08:00
都 2023 年了,JS 连长整型都不支持。。。辣鸡
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
2023-08-01 23:13:33 +08:00
为什么没有 Math.average ?令人费解
IvanLi127
2023-08-02 03:08:03 +08:00
这。。。是想批量提交给运行时提升效率?感觉没啥用啊这函数
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
2023-08-02 08:00:55 +08:00
Math.sum(1,"2",3)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/961532

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX