语言要尽量贴近自然规则,规则定义越少越好。js 规则多,有些还毫无必要。用 0 表示 1 月这都什么规则啊,还有{}规则。
1
marcong95 72 天前 2
JS 语言本身 JSer 又不是 TC39 ,人微言轻的怎么卷得动。你可以考虑直接上 deno 、bun 跑 TS 。不过有一说一,最近写了一段时间 Python ,我倒是感觉 JS 比 Python 还是相对舒服一点。
至于 0 表示 1 月,这个从 Java 时代古而有之,JSer 一般都直接 npm install dayjs ,谁跟你用原生 Date~~ |
2
ZZ74 72 天前
脚本语言都这样,只是 js 更夸张些。
|
3
FleetingSound 72 天前 1
Js 和 Python 哪有什么心智负担,那么简单好用
|
4
crysislinux 72 天前 4
告诉我们你写过多少 C ,js 不知道简单到哪里去了。。
|
5
BugCry 72 天前 via Android
为什么你的 C 语言不用手动释放变量?
|
6
murmur 72 天前
js 语法简单的不要太简单,最近学 swift 那个语言跟吃屎一样难受
|
7
shadowyue 72 天前
js 的规范都被大佬们迭代了多少个版本,时代变了
|
8
murmur 72 天前
月份这东西 JAVA 早就有解决方案了,枚举就好了,记不住 0 和 1 就定义枚举,WEEK.MONDAY, MONTH.JANUARY ,这会记住了吧
|
9
shintendo 72 天前
没用过 Java 么,Javascript 的 Date 就是直接复制的 java.util.Date
不会真以为是雷锋和雷峰塔吧 |
10
libook 72 天前
觉得 JS 心智负担更大的话,试试用 C 做内存管理和二进制处理,以及看看那些“极致性能优化”过的代码……
|
13
DOLLOR 72 天前
在?表演个手搓 string 库来?
作为 C 入行的,当年最怕的就是字符串处理,不是乱码问题,就是要手动管理资源释放,又或者是工具库缺失,要自己实现,后来写 JS 了才知道原来字符串处理也是可以那么轻松快乐。 且不说 ES6 之后 JS 也越来越完善,越来越现代化。哪怕是 ES3 时代,JS 的心智负担都比 C 小。 |
14
zhangenming 72 天前 1
|
15
ninjashixuan 72 天前 2
Js 和 Python 自己只用 good part 就行了,只是读别人代码时才会遇到奇奇怪怪的用法。
|
17
Plumbiu 72 天前
两个语言压根不在一个赛道上,比较有啥意义吗?
|
18
LuckyLauncher 72 天前
你自己卷 C 能原生跑在浏览器上吗?
|
19
davehandong 72 天前
Js 跟 C 没有啥可比性,运行机制不一样。就像上面说的完全不是一个赛道上的。
|
20
wusheng0 72 天前 via Android 6
这是缺铜币了。嗟!来食!
|
21
dudubaba 72 天前
这完全不是 js 语言的错,0 表示 1 月不就跟下标是一样的吗,很难理解? 维基百科中 “阿拉伯语、希伯来语、越南语和葡萄牙语以星期日作为一周中的第一天”,这个又怎么算呢?
|
22
glcolof 72 天前
据说 Javascript 程序员是所有程序员里面最推崇 Rust 的,颇有一种东北人最喜欢海南的既视感。
|
24
bojackhorseman 72 天前
@glcolof 笑死,js 菜鸡表示,根本学不会 rust
|
25
LUO12826 72 天前
(娱乐向)楼主先停停,解读一下这个 C 声明是什么类型~(其实不算很复杂)
int (*(*func)(int *p))[5]; |
26
tkHello 72 天前
赶紧给我卷 成果呢 成果呢 成果呢 我要成果
|
27
AceGo OP c 不好,java 不好,整个 c++、kotlin 、python 、rust 、go ,不断有新语言出现。
我的意思是为啥前端语言没有新发展,始终在 js 上打补丁,修修补补有三年。 |
28
AceGo OP 这更差,那更差的,这坨屎不是最差的。说这是“屎”还急眼了。
手搓库、枚举 Month 等,这不就是打补丁吗,C 内存被诟病,有了 rust 有了 go 啊 打补丁和发展新语言是一回事儿吗 |
29
shijingshijing 72 天前
@LUO12826 什么样的场景会用到这个。。。
|
30
10bkill1p 72 天前
你问浏览器厂商啊,问我们干什么
|
31
dfkjgklfdjg 72 天前
C 的 localtime() 月份不就是从 0 开始的吗?
|
32
ck65 72 天前
|
34
BeautifulSoap 72 天前 1
初学 JS 的心智负担在于 JS 作为一个 30 来年的语言,而且为了兼容各种浏览器的,几十年前老的写法用法依旧还保留着,而且很多写法你还不能不学,因为很多写法很多人都在用。然后几十年积累下来各种奇奇怪怪的写法,用法,功能,还有各种奇奇怪怪的符号能让初学的人学到头炸
|,||,??=, ??, !! 等等等等奇奇怪怪的符号 就一个异步函数,从古早的 callback 到后来的 Generator ,Promise ,再到终于初具人形的 async/await ,你终于以为可以一把 async/await 走天下了,结果是前面几种也全都要学和写,因为这几样东西现在依旧各自有非常多的使用场景。更重要的是有的人就是特别喜欢捣鼓 Promise 而有的人就是不想碰 Promise 只喜欢 async/await ,你必须都要会 再比开 strict 模式之前之后,js 行为简直就是两个语言。我至今还记得如果不开 strict 模式,就一个 this 的特性,都能让人眼前一黑 var 的的全局提升特性(谢天谢地现在终于用 var 的人少了,但各种小脚本或者内嵌 js 引擎里依旧 var 满天飞,你依旧必须学 var 这东西和里面坑) 再比如习惯了类继承概念的人接触用 prototype 实现继承的时候,一定也是学得非常难受。当然现在我已经 class extends 一把梭走天下了,prototype 让我碰那是不可能的 再比一个风格问题,箭头函数这东西的确是个好东西,但作为一个常年后端的人,看到别人经常满天飞的箭头函数依旧要扶额。普通定义一个函数都要 const foo = () =>{ } 这种写法,我虽然知道前端很喜欢这么干,但依旧觉得大受到震撼 再还有 Array.sort() 会把数组所有成员转换成字符串然后才做排序导致第一次用的人 100%中招出 bug 啊之类的都算小问题了 |
35
DOLLOR 72 天前
@BeautifulSoap
|是位操作符,||是逻辑或,!是逻辑非,都是从 C 家族继承来的符号,如果你是写 python 、lua 、pascal 过来的,确实可能会觉得奇怪。 我倒觉得`const foo = () =>{ }`比`function foo() {}`更好,后者会改变 this 指向,会提升变量,甚至在非严格模式下,会逃出语句块,重名不报错。const foo = () =>{ }一把梭就没这些心智负担,并且体现了函数跟其他数据都是同等地位的的东西,既可以赋值给变量,也可以作为参数和返回值。 |
36
BeautifulSoap 72 天前 1
@DOLLOR | 属于手滑了,而至于||,不好意思,你以为我是没见过逻辑或的操作符,而实际上我在跟你说的是 const result = "a" || "b" 这个写法里,reslult 的值为 "a" 而非 true 的反直觉||特性。判断左边元素真假然后返回右边元素,你跟我说这叫逻辑或,写了这么多年静态语言的我反正是不认的,python 等动态语言也没这么奇怪的逻辑或认。
> 我倒觉得`const foo = () =>{ }`比`function foo() {}`更好,后者会改变 this 指向,会提升变量,甚至在非严格模式下,会逃出语句块,重名不报错。 你看。你这就给大家解释了下什么叫 js 的心智负担 |
37
zhouyin 71 天前
c 语言 你去做个小项目 体验体验每个函数都要检查返回值 学学怎么写 makefile 虽然 go 也这样 但比 C 开发不知快了多少
|
38
DOLLOR 71 天前
“python 等动态语言也没这么奇怪的逻辑或认”
此言差矣。 以下是 python ,不支持你的观点。 result = 'a' or 'b' print(result) # result is 'a' 以下是 lua ,不支持你的观点。 local result = 'a' or 'b' print(result) result is 'a' |
39
DOLLOR 71 天前
@BeautifulSoap
“python 等动态语言也没这么奇怪的逻辑或认” 此言差矣。 以下是 python ,不支持你的观点。 result = 'a' or 'b' print(result) # result is 'a' 以下是 lua ,不支持你的观点。 local result = 'a' or 'b' print(result) result is 'a' |
40
TimPeake 71 天前
打起来,打起来.jpg
|
41
shintendo 71 天前 1
|
42
shintendo 71 天前
这年头 Python 也有云玩家
|
43
Satelli 71 天前 1
就是从哪开始学顺带捡了对应的习惯而已。不熟悉的自然就叫心智负担了。
|
44
iorilu 71 天前
要 c 真的那么好, 为什么会有这么多语言呢
说 c 简单得可能没写过 500 行以上得程序把 |
45
GeekGao 71 天前
op age < 26 ,鉴定完毕
|
46
sunchuo 71 天前
特意页面搜索了一下。
这个帖子里竟然完全没人提 PHP 。看来真的是 dead 了。 |
47
juntaol678 71 天前 via Android
语言之争真没必要,存在即合理,如果一个语言真的一无是处或者弊病很多,自然会被大家摒弃。
|
49
FreeGuy 71 天前
搞个鸡儿,神级语言 Pascal 都没发话,inline asm + pascal 飞起....
|
50
GPLer 71 天前 via Android
规则定义越少越好——你是否在寻找 lisp ?
(・∀・) |
51
zhouyin 71 天前 via Android
c 简单?刚让我想起来了 你先去熟悉起编译器选项来 -W 开头的 -f 开头的 用 c 差不多是石器时代
|
52
linglingling 71 天前 via Android
@Seven711 JavaScript 没变化?我知道的前端一直在用最新的,nodejs20 ,es7 等等。麻烦 javaer 把项目升级到 java17 再来讨论
|
54
Felldeadbird 71 天前
JS 比 C 简单啊。心智负担也就是语法太多和浏览器的屎。非要说 JS 心智负担,我觉得就是 JS 的茴写法
|
55
Seven711 71 天前
@linglingling 老哥,你要不仔细看看我的回复😂
|
56
jinliming2 71 天前 via iPhone
WebAssembly 了解一下?可以把各种语言 C/C++, Rust, Go 等编译到浏览器运行。
在浏览器环境下,JS 需要由 HTML 来加载,WebAssembly 需要由 JS 来加载,这都是为了向前兼容。 古旧浏览器不支持 JS 的,在 HTML 里可以打印降级提示,旧浏览器不支持 WebAssembly 的,也可以用 JS 写降级逻辑。 |
57
BeautifulSoap 71 天前
|
58
DOLLOR 71 天前
@BeautifulSoap
除了 Array.prototype.sort()属于没看文档误用,箭头函数属于没说到关键点,其他都是翻旧账问题,懒得吐槽。 |
59
BeautifulSoap 71 天前 via Android
@DOLLOR 说得很好,这就是 js 程序员
|
60
DOLLOR 71 天前
@BeautifulSoap
额,我主要语言是 TS |
61
shintendo 71 天前
@BeautifulSoap 因为其它槽点都是 1.我不习惯 2.语言改进了,但是我需要看旧代码
|
62
shintendo 71 天前
说实话,JS 一个缺陷如此之多的语言,楼主能连续精准找出不属于 JS 的缺陷的点吐槽,也是不容易的,人体描边大师了
|
63
iceheart 71 天前 via Android
领域不同,各有各的烦恼
|
64
vx7298 71 天前
吐槽 js 的,都不是合格的程序员,合格的程序员都有一万种擦屎技巧,巨头们为了凸显自己的战略价值有多么的牛逼,变着法的拉,tmd
|
65
DefoliationM 71 天前
|
66
BeautifulSoap 71 天前
@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 学习上的心智负担 |
67
moudy 71 天前
给你扔到一堆.h 文件里,手动硬吃#ifdef 就老实了
|
68
echo1937 71 天前
@marcong95 但是啊,2014 年发布 java8 的时候,就把这个不合理的设计给 Deprecated ,增加了新的 time api ,否则人人都要先导入一个 joda-time ,Java 还一直被称为历史包袱重,进步缓慢的语言呢。
|
69
shintendo 71 天前
@BeautifulSoap
前端语言是执行在用户设备上的,开发者对运行时的 JS 版本有更大的不确定性,这是跟后端语言很大的不同,向后兼容性要求 ES 迭代只能做加法。这不是 JS 的设计决定,是前端语言的特性决定的,这就是你的“不习惯”。你换 Py 来当前端语言,那 Py3 就不会长这样了。 “像我说的 const foo = () => {}; 还有 (function() {})(); 这种经典的为了规避问题的 JS 写法随着 strict 模式出现不用这么写了而绝迹了吗?” --- 给我看傻了,箭头函数和 IIFE 为什么要绝迹?跟 strict 模式又有什么关系? strict 模式是 ES5 引入的,箭头函数是 ES6 引入的,先后顺序都没搞清楚嘛 |
70
shintendo 71 天前
再看你说的 Array.prototype.sort(),这也是写多了静态语言导致的“不习惯”。Array 里面是什么东西都能放的,这种情况下默认排序方式除了全转成字符串以外,还有更合理的吗?难道先遍历一趟看看是否全是数字?
这个最多就是有点反直觉,完全谈不上不合理的设计。 你想知道不合理的设计,Array 的构造函数才是真正的💩 |
71
marcong95 71 天前
@echo1937 但是客观来说,JSer 确实更加习惯于 npm install 一切,所以 TC39 目测并没有动力去动 native Date 。更何况 deprecated 也不影响大家继续用~~
|
72
rabbbit 71 天前
觉得 js 有负担的可以去体验下 c++,这才是真有负担
|
73
78786381 71 天前
@BeautifulSoap 别人和你好好说话,你自己给别人扣帽子,恶心不恶心人
|
74
Leviathann 71 天前
function 的 hoisting 有什么问题
现在还有几个语言必须先定义 function 再使用的 |
76
BeautifulSoap 71 天前
@78786381 来,你倒是说说我给别人扣了什么帽子?
|
77
BeautifulSoap 71 天前
@shintendo 你有没有发现一个问题,你越是反驳我,越是在证明“初学 JS 的心智负大”这点?我再在这问你一个问题,你反驳我究竟是在反驳什么?
我的观点很简单,JS 长久历史以来,语言本身缺陷,历史包袱,为了兼容,导致形成的各种奇奇怪怪风格和大量的语言功能至今都消解不掉,还必须去学去了解,对初学者造成了心智负担 而你在这反驳却在反驳什么,你反倒一个劲在为这些写法是正常的,没必要取消的做解释。对,这正是我想看到的,你越是卖命解释,就越是证明 JS 里这些奇奇怪怪的写法都是存在在,在你们 JS 程序员眼里这些都是利索当然的。也就越是在证明我上面提出的观点。“初学 JS 的心智负大” JS 为了前端兼容,所以历史包袱非常沉重,这是前端特性决定的,所以“初学 JS 的心智负大”有问题么?所以我再问你,你在这反驳我到底是在反驳什么 |
78
MRG0 71 天前
我感觉还是 c 更难一点,尤其是神秘的指针
|
79
Pencillll 71 天前 via Android
@BeautifulSoap “我说因为 A 所以 B ,你居然在反驳 A ,这反倒证明了 B” 你这一整个立体防御啊
他说这些写法没问题,并且给出了理由,而你坚持说这些写法奇奇怪怪却给不出反驳的理由,甚至用“你们 JS 程序员”这种词来试图营造一个对 JSer 的刻板印象,是否有点太恶意了? |
80
shintendo 70 天前 1
如果你只想输出情绪,一开始就不要列举论据,直接说 JS 设计差、历史包袱多、初学者困惑,我想没几个人会反对。
你既然列举了论据,就要允许别人指出你的论据错误,而不是往地上一躺,抛开事实不谈了。 |
81
oamu 70 天前
@AceGo #27 JavaScript 和浏览器是深度绑定的,更换 JS 的代价太大了。打个不准确的比方,如果说后端换个语言是重新开发个软件的话,那么前端替换掉 JS 就如同重新开发个操作系统。
|
82
fuyun 70 天前
|
83
lyxxxh2 70 天前
@BeautifulSoap
我是后端,但我不赞同你说法。 1. ``` undefined | 4 undefined?.q undefined ?? 4 ``` 这种后端语法糖后端也有啊。 挺多数据字段为空的情况,但是你又不能改结构,这时候就很有用了。 2. async/await 确实可以走天下。 虽有人喜欢 then,但是也没学习成本啊。 至于 callback,这程序员基操啊。 不捣鼓 promise 的,这还是个前端??? promise 属于前端基操。 3. 我没被 var 坑过, 后端的声明,不也是 var 级别的。 我不用 var 主要原因: 遵守最小权限。 至于坑是次要。 4. 我还真不难受,甚至还喜欢,不就是一个 流接口模式吗。 laravel 的 collection 也是这种模式。 data.filter(map(v => [])) ->map(v =>xxx) .reduct(map((v,result) => {},0)).. 然后不用链,光是一个 filter 都要冗余的代码,更不用谈后续的: new_data for xxx i n xxx_data # filter ok if xxx === 1: new_data.push(xxx) 当然自己封装的模块,我更愿意用 class 。 5. 风格: const a = q => q + 1 简洁至极,挑不出一点多余的。 至于理解,不熟悉的人可能难以理解,但是不熟悉谁也没救。 对我来说,比 function(){ return q }理解快多了。 轮语言写法,我最喜欢 js 。 js 是世界上最好的语言,谁赞同 谁反对。 |
85
BeautifulSoap 69 天前 via Android
@shintendo 还是那句话,请摆出你的观点。网上聊天反驳别人论据是可以的,但当一个讨论(对线)话题变得逐渐冗长话题原来越散时,一个人连自己观点都不摆出来那么我就觉得完全没有和这种人讨论的必要了。这也是我没有接着回复你反驳我的那个回复。因为我根本看不出来你到底想干嘛,所以对于该怎么继续这个话题也毫无头绪
|
86
BeautifulSoap 69 天前 via Android
@Pencillll 兄弟,建议重新捋顺一下整个话题逻辑。如果你还无法发现问题所在那我就在这帮你捋一下:
首先再次重申一遍,我已经在一开始就明确地表明了我的观点没有任何隐瞒,我的观点总结起来就 a. js 因为长年历史包袱语言缺陷,导致多年来积年累月的各种写法尾大不掉残类至今,并且为了兼容,语言功能也极多各种机制极其复杂。虽然语言各自有自己风格,但 js 这方面的问题比其他语言严重不知道多少倍 b. js 目前保留的非常多和大量写法功能残留在我眼里都是非常奇奇怪怪的,让人辣眼 综上所述,我认为 js 作为一门语言,对于初学来说初学的心智负担非常大 我这么给你总结后清晰了吗?然后问题回到和我对线的 @shintendo 兄弟,他从头到尾都一直只是在抓着我上面观点中的 b 进行攻(对)击(线)。是的,b 是一个攻击我观点的着力点,关于 b 的对线我是愿意奉陪的,但请问我的观点的核心是依赖 b 吗?我的核心观点依赖的是 a 。 你可以和我大战三百回合,假设最极端的我被说服了撤回了 b ,但这只反过来证明了 a 中我说 JS 的各种庞杂复杂的内容是客观存在的事实。 所以我才一而再再而三地要求亮观点,因为我无法理解,只对我 b 做攻击的人,到底是想从什么角度来驳倒我的观点, |
88
loading 13 天前
唯手熟尔
另,对于月份用 0 开始,计算机本来就从 0 开始数,下面这个你体会一下。 ```js const Months = [ '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月' ]; console.log(Months[new Date().getMonth()]); ``` |