V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
3dwelcome
V2EX  ›  前端开发

Javascript 为什么不增加静态类型呢?

  •  
  •   3dwelcome · 2022-03-08 01:35:21 +08:00 · 2948 次点击
    这是一个创建于 1000 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://2021.stateofjs.com/

    这网站对 JS 生态做了一个调查,由 1 万多个人,统计出来最大的遗憾,就是 JS 缺乏静态类型。

    今日不比往年,技术飞速发展,使得 JS 最终是以 JIT 实时转义后的静态类型语言,运行在 CHROME 浏览器上的。

    有 JIT 加持后,要给 JS 加个类型,对于 google 并不是很难的事情,可一直没人去推动。(我不想用 TS 啊,就想用原生 JS 那个熟悉的味道。)

    30 条回复    2022-03-14 11:43:54 +08:00
    Rocketer
        1
    Rocketer  
       2022-03-08 02:02:05 +08:00 via iPhone
    现在 js 已经像是一门低级语言了,无论你用 es6 还是 ts ,最终都给你编译成 es5 运行。所以 js 本身怎么改已经无所谓了,理论上你甚至可以用 Java 写,然后编译成 es5 。只要有编译器即可
    yyfearth
        2
    yyfearth  
       2022-03-08 03:18:24 +08:00
    那不就是 TypeScript 吗
    不是所有人都喜欢类型的呀

    为啥你不喜欢 TS 又想要类型?

    TS 本来就可以兼容绝大部分的 JS
    你不想要类型 TS 你定义成 any 基本上就和 JS 差不多了

    另外 Google 有 Dart 呀
    推过 但是失败了 现在靠 Flutter 来用 而且最终编译成 JS

    @Rocketer 未来我觉得还是要看 Wasm
    不管是 JS 还是 TS 还是 Rust/C++ 甚至 Java/C# 都编译成 Wasm 就可以了
    yyfearth
        3
    yyfearth  
       2022-03-08 07:15:29 +08:00
    @3dwelcome 现在给 JS 加类型 语法就 2 种 要么学 TS 类型写在变量后面 a: string
    要么学 Java 写在前面 String a 基本上就是 Dart 的做法
    说要用变量名来表示类型的就是扯淡 string_a 这个根本没办法统一 而且之前也有这么做过的 问题多的要命

    “我不想用 TS 啊,就想用原生 JS 那个熟悉的味道”
    加上类型后就不是 原生 JS 的味道了啊
    而且现在 TS 已经很成熟 JS 直接改个名 然后加几个 any 就可以跑了 具体的类型验证 后面再加也行
    唯一就是用一些第三方库 需要找 typing 或者写 def 有一点点麻烦
    murmur
        4
    murmur  
       2022-03-08 07:43:20 +08:00
    性能瓶颈在 dom ,不在 js 部分,后端你认为不行你可以 java 可以.net 可以 go ,何必一棵树上吊死
    cmdOptionKana
        5
    cmdOptionKana  
       2022-03-08 08:27:33 +08:00
    不理解,JS 加了 typing ,与 TS 有什么本质区别?只能是大同小异吧。
    creanme
        6
    creanme  
       2022-03-08 09:15:13 +08:00
    @yyfearth ts 类型太复杂了,不太喜欢
    DOLLOR
        7
    DOLLOR  
       2022-03-08 09:17:39 +08:00
    python 的 type hint 都五六年了,都没多少人用,还备受嫌弃,毕竟多数人还是更向往“自由”的。
    如果真的想要静态类型,那就不要找借口嫌弃 TS 。
    3dwelcome
        8
    3dwelcome  
    OP
       2022-03-08 09:23:19 +08:00
    @yyfearth "而且现在 TS 已经很成熟 JS 直接改个名 然后加几个 any 就可以跑了"

    所以我其实没搞清楚是有了 TS 的存在,JS 才没考虑加静态类型。

    还是说有了 WASM 这种预编译语言后,不再需要 JS 大展拳脚。

    还是说 JS 已经年迈,有其他语言替代,加不加都无所谓,该退休了。

    可是静态类型缺失,在 JS 用户统计里占第一,就是刚需般的存在。GOOGLE 说看不见用户需求,那就是看不见。
    3dwelcome
        9
    3dwelcome  
    OP
       2022-03-08 09:27:48 +08:00
    @DOLLOR JS 不一样,有类型的话,我肯定用。

    现在 JS 代码用 parseInt 或者 parseFloat 来确保一个准确的数字类型,移植复杂点的数学算法,调试很困难,我也是挺无语的。
    yaphets666
        10
    yaphets666  
       2022-03-08 09:28:59 +08:00
    根本问题就是这门语言设计之初就是 script 用的,没想这么多问题。
    cheng6563
        11
    cheng6563  
       2022-03-08 09:42:53 +08:00
    lua 为啥不加静态类型?
    python 为啥不加静态类型?
    bash shell 为啥不加静态类型?
    yyfearth
        12
    yyfearth  
       2022-03-08 09:47:01 +08:00   ❤️ 3
    @3dwelcome 我记得本来 JS 是想加类型的 你可以看下 ECMAScript 4 https://evertpot.com/ecmascript-4-the-missing-version/
    但是失败了

    然后有了 TypeScript Dart Flow 基本上都是为了给 JS 加静态类型
    结果就是 TS 成功了 Dart 在靠 Flutter 续命 Flow 死了

    当初 ES4 失败 我记得是因为大部分 JS 的开发者并不想要类型 觉得太麻烦了 太复杂
    而且就是给网页写点 script 方便好用才更重要 灵活性更重要

    但是随着 webapp 越来越大 需要团队协作的越来越多
    所以静态类型的重要性就越来越大

    我个人认为 现在 JS 根本不打算再尝试加入类型:
    1 是有之前的失败
    2 已经有了很成熟的 TS 和 Dart 有需要的人为啥不用
    3 现在 JS 核心人员有不少就是不喜欢 TS 和静态类型的 就是不想要和 TS 这些一样 你看下最近出的 private field/method 就知道了

    @creanme 既然是静态类型 肯定会越来越复杂的呀 毕竟有大型工程的需要

    ----

    @3dwelcome 另外我猜你可能是希望通过引入静态类型来提高 JIT 性能 可能你不是特别在意静态类型本身
    这样其实各大浏览器开发商已经在往这个方面努力了
    之前有 asm.js 其实就是给 简化的 JS 加上基本类型的静态类型 这样就可以直接编译成本地代码执行
    然后 asm.js 进化成了 wasm
    所以 JS 本身就没有必要为了性能去添加静态类型的复杂度
    想要性能 可以用支持静态类型的语言之间编译成 wasm
    想要灵活性 就用 ES 或者编译到 es5 就是
    gadfly3173
        13
    gadfly3173  
       2022-03-08 10:54:14 +08:00
    ts 的语法对于熟悉 java 之类的强类型语言的人来说用起来还是挺难受的。。尤其是类型要写在变量名后面。。
    Leviathann
        14
    Leviathann  
       2022-03-08 11:37:38 +08:00
    @gadfly3173 没什么感觉,java 我都写 var 的
    anguiao
        15
    anguiao  
       2022-03-08 11:47:51 +08:00
    不如等 wasm 完善,喜欢的就直接用其他语言写好了,干嘛一定要给 JS 加类型呢?
    NewYear
        16
    NewYear  
       2022-03-08 11:48:01 +08:00
    学习 C#用了 VS 后,认为类型还是非常重要的,虽然增加了一点负担,但是能带来较大的便利性。

    不指定类型,表面上看是很简洁很舒服,但是指定类型能让 IDE 带来无比强大的自动 debug 和智能提示,写代码变得更加便利而不是更不方便,甚至能将很多编写错误的代码在编写环节就发现,减少了很多 debug 次数。
    3dwelcome
        17
    3dwelcome  
    OP
       2022-03-08 11:56:25 +08:00 via Android
    @NewYear 严重同意最后一句,JS 没类型很难预测代码的执行结果。
    花大量时间调试语言设计上的问题,完全是浪费时间浪费生命。
    3dwelcome
        18
    3dwelcome  
    OP
       2022-03-08 12:00:56 +08:00 via Android
    @anguiao 既生瑜何生亮,wasm 的命运,和当年 flash 一样,注定只能是插件的形式存在。访问不了 DOM ,就替代不了 JS 。
    只要 JS 老大哥不让位,浏览器领域就没别的语言能取而代之。
    kop1989smurf
        19
    kop1989smurf  
       2022-03-08 12:10:32 +08:00
    我个人理解主要还是历史包袱问题。

    js 的初衷就是写个简单的逻辑脚本,没想过当 web 软件工程的主要开发媒介。
    既然如此,那么强制类声明、强类型就都是没有必要的。(毕竟数据源都不严肃)
    再加上楼上说的历史路线问题。

    web 开发发展到现在,网页、脚本都需要编译才能运行了,我认为已经非常的背离初衷了。
    整个 web 开发领域都在一个羸弱的根基上盖摩天大厦。这是我个人从情感上很难以接受的。

    希望这个现像早日改变。
    3dwelcome
        20
    3dwelcome  
    OP
       2022-03-08 12:23:38 +08:00 via Android
    @kop1989smurf 历史包袱能理解,可是 google 是有能力改变的,比如让 wasm 直接访问 dom ,这对 chrome 开发者绝非难事。
    google 没选择那么做,就是希望大家还是继续用古老的 js 。
    以前微软这点就做得很好,至少还有个 VBScript ,让你有的选。不像 google 掌权,一家独大,完全没得选。
    wanguorui123
        21
    wanguorui123  
       2022-03-08 12:29:19 +08:00
    有了静态类型就不是 JS 了,没有静态类型也是 JS 优势,JS 更灵活快速
    3dwelcome
        22
    3dwelcome  
    OP
       2022-03-08 12:33:02 +08:00 via Android
    @wanguorui123 我一直觉得软件核心是算法,不是拼大量字符串。
    动态类型拼字符串可以,写点算法就很是痛苦。
    wanguorui123
        23
    wanguorui123  
       2022-03-08 13:20:14 +08:00
    @3dwelcome 没有静态类型也能写出不错的代码,只是需要开发者的代码约束能力比较强
    enchilada2020
        24
    enchilada2020  
       2022-03-08 16:25:31 +08:00 via Android
    @wanguorui123 有没有好的例子
    enchilada2020
        25
    enchilada2020  
       2022-03-08 16:25:48 +08:00 via Android
    @wanguorui123 代码约束能力这块
    EPr2hh6LADQWqRVH
        26
    EPr2hh6LADQWqRVH  
       2022-03-08 16:34:01 +08:00
    动态是优势不是缺陷,ts 的类型系统更灵活。

    纯静态语言不可能拥有像 ts 这样灵活性。

    纯静态才是缺陷。


    打个比方,一般来讲四只脚的动物跑得都比两只脚的快,
    你现在出来责问,为什么长短跑运动员不使用四肢参赛,而只使用下肢

    因为上肢拿去提供更高阶的东西了好吧,就算手脚并用能跑得更快,人也不会放弃那些高阶特性手脚并用的
    3dwelcome
        27
    3dwelcome  
    OP
       2022-03-08 17:04:03 +08:00
    @avastms 从统计学上来说,这网站上至少参加 JS 投票的一大半人,都觉得静态类型是一个缺陷。

    你可以不用静态类型,但是不能没有。

    如果 CPP 新规范里只允许 auto 动态类型存在,不允许 int 或者 double ,那早就闹翻天了。
    dsrkafuu
        28
    dsrkafuu  
       2022-03-09 01:24:18 +08:00
    我喜欢用 TS 写代码,我后面自己维护也舒服得多
    但我喜欢 JS 这门语言,不喜欢 TS 这个超集 /语言,可玩性太强了
    yyfearth
        29
    yyfearth  
       2022-03-09 02:54:28 +08:00
    @3dwelcome wasm 目前设计的目的是可以直接把现有的软件编译到浏览器里面运行 而且主要就是算法部分
    或者借助 wasm 把 js 里面有性能瓶颈的部分 更加高效的执行
    另外 wasm 和 js 可以无缝集成 这样 wasm 就可以借助 js 来操作 dom js 也可以借助 wasm 来提升核心算法的效率
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   924 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 20:29 · PVG 04:29 · LAX 12:29 · JFK 15:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.