JavaScript 比 C 有更重的心智负担, Jser 们别卷框架了,卷点语言吧

9 天前
 AceGo

语言要尽量贴近自然规则,规则定义越少越好。js 规则多,有些还毫无必要。用 0 表示 1 月这都什么规则啊,还有{}规则。

6481 次点击
所在节点    JavaScript
86 条回复
shintendo
8 天前
@BeautifulSoap 因为其它槽点都是 1.我不习惯 2.语言改进了,但是我需要看旧代码
shintendo
8 天前
说实话,JS 一个缺陷如此之多的语言,楼主能连续精准找出不属于 JS 的缺陷的点吐槽,也是不容易的,人体描边大师了
iceheart
8 天前
领域不同,各有各的烦恼
vx7298
8 天前
吐槽 js 的,都不是合格的程序员,合格的程序员都有一万种擦屎技巧,巨头们为了凸显自己的战略价值有多么的牛逼,变着法的拉,tmd
DefoliationM
8 天前
@AceGo 我的意思是为啥前端语言没有新发展,始终在 js 上打补丁,修修补补有三年。

这不 wasm 来了吗,也没人逼你用 js 呀。
BeautifulSoap
8 天前
@shintendo

> 初学 JS 的心智负担在于 JS 作为一个 30 来年的语言,而且为了兼容各种浏览器的,几十年前老的写法用法依旧还保留着,而且很多写法你还不能不学,因为很多写法很多人都在用。然后几十年积累下来各种奇奇怪怪的写法,用法,功能,还有各种奇奇怪怪的符号能让初学的人学到头炸

看仔细了么, 我的观点都写得这么清晰了:“ (初 学 JS 的心智负担不在于语言本身缺陷或像 rust 那样设计到多深奥的知识),而在于源于各种历史包袱下大量的约定俗写法用法功能导致的心智负担”
都写的这么清楚了,我之后列举的所有槽点也都是围绕着我的观点进行的,所以我也就没多提 js 本身的缺陷,我这里说的都是初学 JS 的问题。so ,有问题?

的确像上面有人说的换一种语言相当于换了一种写法,不习惯会有压力这是正常的。但任何事都有个度,什么叫“语言改进了,但是我需要看旧代码”?只在旧代码里看到这些我就无所谓了,可是当年 JS 因为历史原因和缺陷,那些旧的写法、知识、用法随着语言改进,这么写的人越来越少了吗?
像我说的 const foo = () => {}; 还有 (function() {})(); 这种经典的为了规避问题的 JS 写法随着 strict 模式出现不用这么写了而绝迹了吗?并没有。现在不一堆人还在写这样的代码,而且可以预见的未来也不会消失。这不是光去看旧代码的问题,而是已经没有大量使用必要了还必须要了解适应当年为了规避问题养成的习惯写法。新的程序员更喜欢 function 等写法,夹杂着用旧写法的人,堪称美丽

再一个 async/awawit 出现后,喜欢 Promise.then().catch() 以及 Promise 里套 Promise 的人消失或者很少见了吗?虽然有时候的确有必要鼓捣 Promise 但很明显 js 程序员里,对 Promise 和 async/await 的选择并不是源于所谓的各自的使用场景

再一个 class ,ES6 里引入之后鼓捣 prototype 实现继承的人数难道消失了?虽然 class 本质是 prototype 套皮,的很明显后来有其他语言经验的人必定更适应 class 的写法,而另一部分人则更喜欢 prototype 。class 的写法和 prototype 两种截然不同的风格今后也会长期永久并存下去。你必须都会写都要了解

再一个 js 常年累月积累的各种语言特性和功能,上一次初学一门语言让我有种记不过来的情况还是 kotlin 。虽然 kotlin 也算得上是大量语法糖构成的语言,但在语言功能的记忆点上和 js 一比也是小巫见大巫

等等等等

这就是我说的,JS 学习上的心智负担
moudy
8 天前
给你扔到一堆.h 文件里,手动硬吃#ifdef 就老实了
echo1937
8 天前
@marcong95 但是啊,2014 年发布 java8 的时候,就把这个不合理的设计给 Deprecated ,增加了新的 time api ,否则人人都要先导入一个 joda-time ,Java 还一直被称为历史包袱重,进步缓慢的语言呢。
shintendo
8 天前
@BeautifulSoap

前端语言是执行在用户设备上的,开发者对运行时的 JS 版本有更大的不确定性,这是跟后端语言很大的不同,向后兼容性要求 ES 迭代只能做加法。这不是 JS 的设计决定,是前端语言的特性决定的,这就是你的“不习惯”。你换 Py 来当前端语言,那 Py3 就不会长这样了。


“像我说的 const foo = () => {}; 还有 (function() {})(); 这种经典的为了规避问题的 JS 写法随着 strict 模式出现不用这么写了而绝迹了吗?”
---
给我看傻了,箭头函数和 IIFE 为什么要绝迹?跟 strict 模式又有什么关系?
strict 模式是 ES5 引入的,箭头函数是 ES6 引入的,先后顺序都没搞清楚嘛
shintendo
8 天前
再看你说的 Array.prototype.sort(),这也是写多了静态语言导致的“不习惯”。Array 里面是什么东西都能放的,这种情况下默认排序方式除了全转成字符串以外,还有更合理的吗?难道先遍历一趟看看是否全是数字?
这个最多就是有点反直觉,完全谈不上不合理的设计。

你想知道不合理的设计,Array 的构造函数才是真正的💩
marcong95
8 天前
@echo1937 但是客观来说,JSer 确实更加习惯于 npm install 一切,所以 TC39 目测并没有动力去动 native Date 。更何况 deprecated 也不影响大家继续用~~
rabbbit
8 天前
觉得 js 有负担的可以去体验下 c++,这才是真有负担
78786381
8 天前
@BeautifulSoap 别人和你好好说话,你自己给别人扣帽子,恶心不恶心人
Leviathann
8 天前
function 的 hoisting 有什么问题

现在还有几个语言必须先定义 function 再使用的
shintendo
8 天前
@marcong95 Temporal 就是 Date 替代,已经 Stage 3 了。这个确实不重要,dayjs 才 2kb
BeautifulSoap
8 天前
@78786381 来,你倒是说说我给别人扣了什么帽子?
BeautifulSoap
8 天前
@shintendo 你有没有发现一个问题,你越是反驳我,越是在证明“初学 JS 的心智负大”这点?我再在这问你一个问题,你反驳我究竟是在反驳什么?
我的观点很简单,JS 长久历史以来,语言本身缺陷,历史包袱,为了兼容,导致形成的各种奇奇怪怪风格和大量的语言功能至今都消解不掉,还必须去学去了解,对初学者造成了心智负担

而你在这反驳却在反驳什么,你反倒一个劲在为这些写法是正常的,没必要取消的做解释。对,这正是我想看到的,你越是卖命解释,就越是证明 JS 里这些奇奇怪怪的写法都是存在在,在你们 JS 程序员眼里这些都是利索当然的。也就越是在证明我上面提出的观点。“初学 JS 的心智负大”

JS 为了前端兼容,所以历史包袱非常沉重,这是前端特性决定的,所以“初学 JS 的心智负大”有问题么?所以我再问你,你在这反驳我到底是在反驳什么
MRG0
8 天前
我感觉还是 c 更难一点,尤其是神秘的指针
Pencillll
8 天前
@BeautifulSoap “我说因为 A 所以 B ,你居然在反驳 A ,这反倒证明了 B” 你这一整个立体防御啊

他说这些写法没问题,并且给出了理由,而你坚持说这些写法奇奇怪怪却给不出反驳的理由,甚至用“你们 JS 程序员”这种词来试图营造一个对 JSer 的刻板印象,是否有点太恶意了?
shintendo
8 天前
如果你只想输出情绪,一开始就不要列举论据,直接说 JS 设计差、历史包袱多、初学者困惑,我想没几个人会反对。

你既然列举了论据,就要允许别人指出你的论据错误,而不是往地上一躺,抛开事实不谈了。

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

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

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

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

© 2021 V2EX