
Javascript 语言中有了 for 循环语句,为何还要有 forEach、map、reduce 等这些高级的语法,仅仅是为了代码简洁吗?但是代码执行效率可能会有所下降吧(未证实过,只是猜测。。)?
1 momocraft 2019-04-03 17:29:29 +08:00 简洁还不够吗 |
2 vampuke 2019-04-03 17:32:34 +08:00 执行效率的下降基本可以忽略不计,代码的简洁和可读性都大幅提高 |
3 qiuxiaojie 2019-04-03 17:33:23 +08:00 函数式编程必备 forEach map reduce |
4 VDimos 2019-04-03 17:34:56 +08:00 via Android 这些不是语法,只是封装起来更好用而已 |
5 MaxTan 2019-04-03 17:35:07 +08:00 你说的这些都是 function 吧,并不是语法。。。 |
6 KuroNekoFan 2019-04-03 17:35:59 +08:00 谈下我的看法 用 for 迭代的话,需要事先声明多个临时变量,并且这些临时变量是在比逻辑代码层级更高的 block scope 中 引入了 forEach/map/reduce 之后,可以以更 functional 的方式来编写代码 |
7 1010011010 2019-04-03 17:36:40 +08:00 这些方法都有自己的适用场景 |
8 summersnow521 OP |
9 NonClockworkChen 2019-04-03 17:37:47 +08:00 每个方法都挺有用的 |
10 userdhf 2019-04-03 17:40:50 +08:00 就是语法糖 js 不光有语法糖 还有语法糖的语法糖.... |
11 miniwade514 2019-04-03 17:42:21 +08:00 如果没有这些方法,你也会自己封装一个的 |
12 ayase252 2019-04-03 17:46:36 +08:00 建议看一下 SICP |
13 shintendo 2019-04-03 17:50:47 +08:00 连语法都不是的东西,也成“语法糖”了 大家各种语言都别用标准库了 |
14 hoyixi 2019-04-03 17:53:41 +08:00 其实,这些语法糖,是 js 补上了缺的作业罢了。 很多脚本语言,这些语法都是相通的 |
15 AV1 2019-04-03 17:56:09 +08:00 没有的时候嫌弃 JS 是残缺的语言,有了又嫌弃 JS 太复杂? |
16 xiangyuecn 2019-04-03 18:07:17 +08:00 这不是语法,这只是方法。 |
17 lastpass 2019-04-03 18:08:58 +08:00 via Android 我给你讲,这些语法糖超甜的说。 |
18 mind3x 2019-04-03 18:16:19 +08:00 学一点 SICP,终身受益。 |
19 mskf 2019-04-03 18:18:18 +08:00 forEach 不保证顺序执行的 |
20 Justin13 2019-04-03 18:21:07 +08:00 via Android 作为函数式爱好者,我已经 1 年多没用过 for 循环了,除了一次写堆排序。 |
21 learnshare 2019-04-03 18:25:18 +08:00 执行效率是引擎该考虑的事情,没多少项目需要从这几行代码上考虑效率问题 |
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 span class="ago" title="2019-04-03 18:47:31 +08:00">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 和作用域 所以会更慢,不过很多时候写起来就是舒服 |