[编程开发] JavaScript 的设计优点是什么?

[复制链接]
pdacn 发表于 2023-10-4 06:53:58|来自:北京 | 显示全部楼层 |阅读模式
很多文章都在各种批评 JavaScript 设计糟糕,但是不可否认 JavaScript 现在发展的相当好( node.js / coffeescript 等)。作为一门编程语言,它有什么设计上的优势?
全部回复5 显示全部楼层
梦幻儿 发表于 2023-10-4 06:54:52|来自:北京 | 显示全部楼层
JavaScript的设计最大的优点就是在实现所有的语言特性时全部选择quickest and dirtiest的路线,所以它才能赶在其它所有竞争对手前面世。
gomenjay 发表于 2023-10-4 06:55:26|来自:北京 | 显示全部楼层
我就提一个最大的优点,它甚至足以抵消 JS 罄竹难书的全部缺点,那就是 JS 可以被嵌入到 HTML 的 script 标签中执行
在 1995 年 JavaScript 1.0 立项之初,当时 Netscape 的老大 Marc Andreessen 强调,Mocha(第一个 JS 引擎的项目代号)应该非常易于使用,任何人都可以直接在 HTML 文档中编写几行
回顾历史,这一设计决策并非理所当然。除了发明一门新的半成品脚本语言外,他们还可以将 Java 作为 Web 的标准语言,或设计语言独立的接口。Java Applet 也是 Netscape 和 Sun 两家公司预期的 Web 应用技术栈正道,它们内部都为了是否需要 Java 和 JavaScript 两门语言有过音量相当大的不同意见。但最后两边老大(Marc Andreessen 和 Bill Joy)力排众议的决策仍然是——选择发明能通过 <script src="x.js"> 的方式解释执行的新语言 JavaScript。相比 Java「将主程序的代码体放在包内部类声明下名为 main 的静态方法中,并为所有参数、返回值和变量声明静态类型」的繁琐操作,嵌在 HTML 文本里就行的 JavaScript 对 Web 来说真是不知道简单到哪里去了。
这个设计决策影响极为深远。从 Netscape Navigator 2.0 这个历史上第一款支持 JS 的浏览器开始,JS 就可以通过这种沿用至今的方式来执行,迄今仍然是给 Web 页面提供动态性的唯一指定高级语言(WASM 这种字节码规范是和 x86 与 ARM 汇编同级的东西,不在此列)。只要用记事本改几行代码保存,刷新网页就能看到结果——JavaScript 这种极低的门槛不知道带了多少人入坑,我也是其中之一。
然后,Netscape 推出的 JavaScript 被微软抄出的 JScript 跟进支持,后面的浏览器厂商基本全部支持了这个 de facto 的事实标准。于是根据《JavaScript: The First 20 Years》中的浏览器博弈论,后面任何主流浏览器厂商想要单独做「正确」的非前向兼容改造,都无法在博弈中取得优势。君不见 ES4 和 Dart 就是前车之鉴。而至于现在的 WASM 能取代 JS 吗?我还是觉得很难,理由参见这里:
WebAssembly 的出现是否会取代 JavaScript?和很多东西类似地,当一个姑且不算那么差的东西(排他性地)占了坑以后,换掉它的成本早就大大超过继续拥护它,给它花式续命的成本了。现实生活中别看大家嘴上怎么骂,身体上都是讲实用主义的,写代码更是这样。
所以,JS 靠着把握历史进程,通过设计上与 HTML 极佳的互操作性占住了 Web 入口 ,当上了浏览器里的天龙人语言——这就是我眼中 JS 最大的设计优点。就为了这一个优点,数以百万计的前端开发者多年来不知道忍受了它多少缺点(摊手)
仙履奇缘 发表于 2023-10-4 06:56:12|来自:北京 | 显示全部楼层
设计的优点?有参照对比才有优劣,语言本身在多范式语言类别里只能是平庸,对工业化应用的思考甚少或全无(这么短的时间产出一门语言,它爹毕竟不是天才),不责怪不抛弃,问题越多其社区越活跃似乎总是应验。JS是目前Github开源社区中最活跃的语言,不是之一。没有一门语言像JS那样有那么多娘,Chrome是它娘,Firefox是它娘,IE是它娘,还有Opera,Safari等等。所以综上是以上其他语言没有或少有的优点,与其叫啥一毛钱关系也没有,干娘与干爹同样重要。
kallen 发表于 2023-10-4 06:56:40|来自:北京 | 显示全部楼层
题主问的是优点,所以这里只谈我觉得好的地方。js固然有很多问题,但也不是一无是处嘛。
1. 单线程事件轮询是个很适合异步并发的模型,因为避免了在程序内部管理多个线程带来的各种问题。这也是为什么Ryan Dahl当时选择了js写了Node。
2. 函数作为一等公民存在,简单够用的原生数据结构,闭包,如果你想的话完全可以写出函数式风格的js。披着C系语言的外衣,流着scheme的血。
3. 灵活。duck typing,动态指定函数的执行语境,动态混入,动态修改原型,动态修改原型链,甚至修改原生对象的原型... 很多时候你会发现java的一些设计模式就是带着镣铐跳舞,在js里完全没有必要。当然,js的灵活也是把双刃剑,在好的工程师手里是一个助力,但在糟糕的工程师手里会产生很多反模式。
omygod 发表于 2023-10-4 06:57:39|来自:北京 | 显示全部楼层
简单,粗暴,各种凑活。不知道这究竟是优点还是缺点。
JavaScript 告诉我们,
时势造英雄,机遇比能力重要。

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则