JavaScript 语言中有了 for 循环语句,为何还要有 forEach、map、reduce 等这些高级的语法,仅仅是为了代码简洁吗?但是代码执行效率可能会有所下降吧(未证实过,只是猜测。。)?
1
momocraft 2019-04-03 17:29:29 +08:00 1
简洁还不够吗
|
2
vampuke 2019-04-03 17:32:34 +08:00 1
执行效率的下降基本可以忽略不计,代码的简洁和可读性都大幅提高
|
3
qiuxiaojie 2019-04-03 17:33:23 +08:00 1
函数式编程必备 forEach map reduce
|
4
VDimos 2019-04-03 17:34:56 +08:00 via Android 1
这些不是语法,只是封装起来更好用而已
|
5
MaxTan 2019-04-03 17:35:07 +08:00 1
你说的这些都是 function 吧,并不是语法。。。
|
6
KuroNekoFan 2019-04-03 17:35:59 +08:00 1
谈下我的看法
用 for 迭代的话,需要事先声明多个临时变量,并且这些临时变量是在比逻辑代码层级更高的 block scope 中 引入了 forEach/map/reduce 之后,可以以更 functional 的方式来编写代码 |
7
1010011010 2019-04-03 17:36:40 +08:00 1
这些方法都有自己的适用场景
|
8
summersnow521 OP |
9
NonClockworkChen 2019-04-03 17:37:47 +08:00 1
每个方法都挺有用的
|
10
userdhf 2019-04-03 17:40:50 +08:00 2
就是语法糖
js 不光有语法糖 还有语法糖的语法糖.... |
11
miniwade514 2019-04-03 17:42:21 +08:00 1
如果没有这些方法,你也会自己封装一个的
|
12
ayase252 2019-04-03 17:46:36 +08:00 1
建议看一下 SICP
|
13
shintendo 2019-04-03 17:50:47 +08:00 1
连语法都不是的东西,也成“语法糖”了
大家各种语言都别用标准库了 |
14
hoyixi 2019-04-03 17:53:41 +08:00 1
其实,这些语法糖,是 js 补上了缺的作业罢了。
很多脚本语言,这些语法都是相通的 |
15
DOLLOR 2019-04-03 17:56:09 +08:00 1
没有的时候嫌弃 JS 是残缺的语言,有了又嫌弃 JS 太复杂?
|
16
xiangyuecn 2019-04-03 18:07:17 +08:00 1
这不是语法,这只是方法。
|
17
lastpass 2019-04-03 18:08:58 +08:00 via Android 1
我给你讲,这些语法糖超甜的说。
|
18
mind3x 2019-04-03 18:16:19 +08:00 1
学一点 SICP,终身受益。
|
19
mskf 2019-04-03 18:18:18 +08:00
forEach 不保证顺序执行的
|
20
Justin13 2019-04-03 18:21:07 +08:00 via Android 2
作为函数式爱好者,我已经 1 年多没用过 for 循环了,除了一次写堆排序。
|
21
learnshare 2019-04-03 18:25:18 +08:00 1
执行效率是引擎该考虑的事情,没多少项目需要从这几行代码上考虑效率问题
|
23
summersnow521 OP @learnshare 我理解的执行效率,是代码运行所需要的时间。之于 for 循环或 forEach、map、reduce 的效率,个人认为应比较的是循环的性能,说白了就是看谁先执行完呗。所以,我在提问中的意思是:对于处理某一个数组,用 for 可能会比这些数组的实例方法要快些吧?
|
24
summersnow521 OP |
25
yamedie 2019-04-03 18:45:50 +08:00 via Android
沙子能烧成砖头,沙子和砖头都能用来盖房,你盖房会用沙子还是砖头?
|
26
snw 2019-04-03 18:47:31 +08:00 via Android
为了让你一边喝 java(咖啡)一遍码代码
|
27
stabc 2019-04-03 18:49:02 +08:00
我还是只用 for,因为用 node,需要 await
|
28
exonuclease 2019-04-03 19:07:36 +08:00
c++语言中有了 for 循环语句,为何还要有 range based for、std::for_each、std::reduce 等这些高级的语法
|
29
fakeshadow 2019-04-03 19:12:53 +08:00
写起来比较方便,多次的 mutation 很好 chain。
如果效率对你的应用特别重要,还是考虑不要用 js 比较好。 |
30
kidlj 2019-04-03 19:12:55 +08:00 via iPhone
That ’ s why I love Golang.
|
31
shyangs 2019-04-03 19:22:38 +08:00
JS 一開始想假裝自己是 Java
JDK1.4(含)以前沒有 forEach, 因此 JS 也沒有 後來 JS 認清自己的本質, 打造了 forEach, map, reduce 等裝備靠攏函數式語言. |
32
binaryify 2019-04-03 19:27:06 +08:00
@summersnow521 直接 for 循环更快,毕竟 map,reduce 组合相当于又跑了几次循环,但是用这点速度换取可读性和简洁性明显更划算
|
33
sxlzll 2019-04-03 19:32:33 +08:00
语言本身就是人写的,主要是给人看,其次给机器读
|
34
445141126 2019-04-04 09:49:57 +08:00
@stabc
await 也可以不用 for ``` const delay = (ms) => new Promise(resolve => setTimeout(() => resolve(), ms)) const arr = [1, ,2, 3] ;(async () => { await arr.reduce(async (promise, s) => { await promise await delay(1000 * s) console.log('delay', s, Date.now()) }, Promise.resolve()) })() ``` |
36
summersnow521 OP @stabc
指的是这个吗? #1 中循环导致执行先后不能确定,#2 中可以按照 for 遍历的顺序去执行? let arr = [1, 2, 3, 4, 5] let delay = count => { return new Promise((resolve, reject) => { setTimeout(() => { console.log(count) resolve('ok') }, count * 1000 * Math.random()) }) } ;(async () => { // # 1 arr.forEach(async (item) => { await delay(item) }) // # 2 // for (let index = 0; index < arr.length; index++) { // await delay(arr[index]) // } })() |
37
stabc 2019-04-04 12:02:26 +08:00
@summersnow521 大概就是这个意思吧。确实不用 for 也可以解决,但是比较麻烦。然后你的#1 似乎也没法等待全部完成,外面还要再嵌套一个 promise all。反正就是哎呀……麻烦……
|
38
SuperMonster009 2019-04-19 11:45:59 +08:00 via Android
这些你都能自己写函数工具然话封装 只是这些默认给你封装好了 直接拿来用 不喜欢的话可以不用 但别人用的话你会看不懂 所以多学无害 如果你真研究透了他是怎么封装的 还会激发你的创造力自己封装造轮子
|
39
jiejiss 2019-04-19 15:30:14 +08:00
@summersnow521 #23 https://jsperf.com/multiple-recurssion-methods-compare/1
函数式因为要构建新的 stack 和作用域 所以会更慢,不过很多时候写起来就是舒服 |