JavaScript 语言为何需要那么多高级语法

2019-04-03 17:25:29 +08:00
 summersnow521

JavaScript 语言中有了 for 循环语句,为何还要有 forEach、map、reduce 等这些高级的语法,仅仅是为了代码简洁吗?但是代码执行效率可能会有所下降吧(未证实过,只是猜测。。)?

5483 次点击
所在节点    JavaScript
39 条回复
learnshare
2019-04-03 18:25:18 +08:00
执行效率是引擎该考虑的事情,没多少项目需要从这几行代码上考虑效率问题
mskf
2019-04-03 18:31:34 +08:00
@mskf 刚看了下。。。说错了,forEach 是顺序执行的
summersnow521
2019-04-03 18:41:33 +08:00
@learnshare 我理解的执行效率,是代码运行所需要的时间。之于 for 循环或 forEach、map、reduce 的效率,个人认为应比较的是循环的性能,说白了就是看谁先执行完呗。所以,我在提问中的意思是:对于处理某一个数组,用 for 可能会比这些数组的实例方法要快些吧?
summersnow521
2019-04-03 18:44:02 +08:00
@userdhf
@hoyixi
@lastpass
这些不应该是封装的实现吗?
yamedie
2019-04-03 18:45:50 +08:00
沙子能烧成砖头,沙子和砖头都能用来盖房,你盖房会用沙子还是砖头?
snw
2019-04-03 18:47:31 +08:00
为了让你一边喝 java(咖啡)一遍码代码
stabc
2019-04-03 18:49:02 +08:00
我还是只用 for,因为用 node,需要 await
exonuclease
2019-04-03 19:07:36 +08:00
c++语言中有了 for 循环语句,为何还要有 range based for、std::for_each、std::reduce 等这些高级的语法
fakeshadow
2019-04-03 19:12:53 +08:00
写起来比较方便,多次的 mutation 很好 chain。
如果效率对你的应用特别重要,还是考虑不要用 js 比较好。
kidlj
2019-04-03 19:12:55 +08:00
That ’ s why I love Golang.
shyangs
2019-04-03 19:22:38 +08:00
JS 一開始想假裝自己是 Java
JDK1.4(含)以前沒有 forEach, 因此 JS 也沒有

後來 JS 認清自己的本質, 打造了 forEach, map, reduce 等裝備靠攏函數式語言.
binaryify
2019-04-03 19:27:06 +08:00
@summersnow521 直接 for 循环更快,毕竟 map,reduce 组合相当于又跑了几次循环,但是用这点速度换取可读性和简洁性明显更划算
sxlzll
2019-04-03 19:32:33 +08:00
语言本身就是人写的,主要是给人看,其次给机器读
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())
})()
```
stabc
2019-04-04 10:15:38 +08:00
@445141126 没看懂你什么意思,我原本意思是用 forEach 没法在里面 await,也没法等待整个循环结束。
summersnow521
2019-04-04 11:29:06 +08:00
@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])
// }
})()
stabc
2019-04-04 12:02:26 +08:00
@summersnow521 大概就是这个意思吧。确实不用 for 也可以解决,但是比较麻烦。然后你的#1 似乎也没法等待全部完成,外面还要再嵌套一个 promise all。反正就是哎呀……麻烦……
SuperMonster009
2019-04-19 11:45:59 +08:00
这些你都能自己写函数工具然话封装 只是这些默认给你封装好了 直接拿来用 不喜欢的话可以不用 但别人用的话你会看不懂 所以多学无害 如果你真研究透了他是怎么封装的 还会激发你的创造力自己封装造轮子
jiejiss
2019-04-19 15:30:14 +08:00
@summersnow521 #23 https://jsperf.com/multiple-recurssion-methods-compare/1



函数式因为要构建新的 stack 和作用域 所以会更慢,不过很多时候写起来就是舒服

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

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

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

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

© 2021 V2EX