对于现代开发来说,JavaScript就是一种垃圾语言

伯乐在线导读:昨天 Reddit/Programming 频道的头条热帖是一篇来自 julik live 博主的技术吐槽文,最初的英文标题是“For modern development Javascript indeed is a shit language”。该文在Reddit得分是800+,引发了热评(930+评论)。感谢@蔡volvo蔡 的热情翻译,以下是译文。

 

我很抱歉,但 Crockford 就是坚持这么写的(I’m sorry, but the Crockford arguments do not cut it.)

Javascript在很多方面都烂透了,而且还极其无趣,我就纳了闷了,大家为啥都义无返顾,群情激奋的跳进Node学习的大军里,是!Node是比Ruby快,Node是基于事件模型处理的,但让我无法理解的是,一些人动不动就想把自己的程序用Node重构一下,过过脑子行吗!

Javascript的继承,深拷贝问题,不是定义一个新ECMA标准就能解决的,不是套个漂亮的语法外壳(比如CoffeeScript)就能搞定的,不是用require实现个标准化或者引入classes就可以万事大吉的,ECMA语言里不是有个引入classes的ActionScript吗!那玩意跟Javascript一样屎,只要大家继续用它,PHP框架的现状就是JS的未来— 一堆一堆的人前赴后继,日以继夜的为这坨屎一样的语言搭框架、写工具。

我来说一下为什么Javascript糟糕,当然了,它也有好的方面。 但是问题就是太不实用。比如说原型继承(prototypal inheritance)就限制颇多-因为这玩意说白了就是function override,还有就是那句:“万物皆function” 也是相当的废柴-因为一function不是一个对象,也不能当做数据机构来承载数据。

其实真正的吐槽才刚刚开始,随便列几个吧:

 

JS的调用属性

看这个屎一样的设计,回顾过去,咱们很难苛责语言的设计人员,因为它们可能处于性能考虑,再者,如果不习惯消息-传递机制的语言的话,你会觉得怎么”一些属性可以被调用而另外一些就不可以呢“!

哈希对象对于stable 键不可用

对象和哈希的混合不是一个好点子,因为它违反了对象可以拥有metadata的前提,metadata允许我们建立基本类型系统或者至少各种类型的introspection

函数对象对于类型系统不可用 因为一个对象不携带任何类型信息

这可是大事,Ruby的世界里也是这样,感觉所有的东西都在像鸭子一样快乐的嘎嘎叫,我们经常用Object$class 来获取对象信息,下面是给HTML元素加样式的标准的流程:

在JS里是不可能的,因为只有’Object’,’function’和原始类型才有类型信息

到处是Null

不小心用错了一个常量

任何事情都不会发生,因为对象是hashes,而且js给常量默认为0。 带着错误key的常量将会是undefined,而且还会渗透到被调用函数中,等出了事,慢慢跟踪debug去吧

回调的深渊

JS缺少合适的deferred功能,不是多线程,就得靠事件化执行,你的调用会散落在各个事件回调中,代码都完事了,回调还在那执行呢,比如,JS干下面这个是就费劲

因为你在等一个结果,就在等待的这会,runtime完全可以进行事件处理、DOM重绘、干啥都行

res.name // this will be only executed once res is available 等res可以使用的时候在去执行res.name的操作

当然了,JS社区做了跟PHP社区一直以来一样的事情-给Javascript这坨屎擦屁股,怎么擦呢?用更多的回调,好点的,就是回调链

一般情况下,加入一个wait primitive就在获取结果的等待过程中控制events,

专业一点的做法就是啥玩意咱都异步,现实是你写的代码80%都是同步的,因为程序里80%干的都是一个操蛋的事情跟另外一个操蛋的事情一起搞,而且你需要它俩都它妈的完事了才行。

可怕的异常处理机制

异常处理在JS中机器可怕,一般形式-你可以查看调用堆栈(一堆匿名函数和好点的名字的函数),你可看到错误信息,我就提两个经常碰到的错误:

这都拜javascript中“函数对(泥煤)象”所赐,根本没有方法定义-它们只有属性,JS运行时永远没有办法知道函数对象有没有方法可以被调用,或者某个属性名称 – 它就认为你的哈希键不存在,

我记得Ruby社区里的人抱怨Ruby的回溯和错误消息机制不好用,Rubinius就给解决了,在泥煤的javascript里,你知道错误消息特别乱吗?因为有你想得到和使用的两个最最基本,最最重要的异常NameError和NoMethodError 都可能,这在其它语言里都是不能理解的,但javascript语言就这么马马虎虎的用起来了

不可否认,functions是亮点,原型也是好东西,但是如果你想建立一个稍微复杂的JS应用,你就得这么写:

如果”MyApp.Views.WidgetView 还没有定义“你会得到啥错误?”undefined is not a function”当然!你什么时候会得到呢?当CollectionView想要实例化你的视图的时候,而不是当你定义变量cv的时候,你会忐忑好几分钟,直到你明白了这错误是哪里导致的

这是为啥呢?因为所有都是hash而且这个语言不能做任何形式的introspection

还有一个困扰我的事就是有些大哥居然从Ruby转战Node,还赞Node是个好东西。Node也许是好宝贝,但是想想它内部运行着屎一样的Javascript语言,我就由衷地想退避三舍。

这么说吧,JS一日不好用,我便一日不会用Node,谢谢

我理解有一些人想跳出MRI架构,投身Node,很简单啊- -你不会说日语, 所以你舔个脸说日语很难学,话撂这,你在MRI上的有精进的机会也它妈趋近于0.

JS是屎,但凡我们有那么一丝丝的担当,就该尽自己的绵薄之力要么让它寿终正寝,要么帮助它更上一层楼,天天在那沾沾自喜对它的发展没有一点帮助,CoffeeScript做的还远远不够。

更新:看这里,我不是一个人在战斗

伯乐在线注:julik live 博主后来把标题改为了“For modern development Javascript indeed is a s̶h̶i̶t̶ dissapointing language”。另外,他博客页脚不美观,占用空间过大,在原文评论中被很多读者吐槽了。当然了,也有热心网友在帮他出主意了。

 

1 收藏 25 评论

关于作者:蔡蔡

(新浪微博:@蔡volvo蔡) 个人主页 · 我的文章

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 多蒙菜   2013/10/31

    缺点重多,但对优点都回避了。能解决最现实的问题就够了。

    • bobo   2013/10/31

      博主应该是在说那些把什么都node话的情况吧. js放浏览器里当然理所当然, 不过node被过度推崇, 就是导致盲目各种node化了.

      • TaoTao   2013/11/04

        异步流程控制确实是个问题,其他的都不是问题,不能拿ruby这种强类型来做比较.

  • 是我打开方式不对么?

  • camelwoo   2013/10/31

    翻译得相当不错

  • 风雨过后   2013/10/31

    难道 我们一直在吃屎? 文章挺犀利的!不错。

  • 说的基本都是事实,js的确有很多很多的问题。但是它总是有一些优点,而且由于在浏览器中的普及所以基本无法替代。坑很多,但好的地方也很闪亮。而且我觉得基本没有什么严重致命的缺陷。

  • 很鸡血的评论

  • JS是屎,但凡我们有那么一丝丝的担当,就该尽自己的绵薄之力要么让它寿终正寝,要么帮助它更上一层楼。

    JS是一坨屎,但在浏览器端就只有这么个选择,所以大家都在想办法把这坨屎做的更美味些。

  • roy   2013/11/09

    为什么要黑php

  • caochao   2013/11/10

    undefined is not a function
    cannot call property 'xyz' of undefined

    哈哈,这两个经典的错误,人艰不拆啊

  • w   2013/11/12

    MyApp.SYNC // should have been MyApp.SYNC_FETCH

    这里多了两个标签: ,估计是要中间的变为斜体吧

  • 语言党。。。

  • LONG哈哈   2013/11/20

    web 端 只能用js 了 因为没有其他更好的选择 所以自动无视缺点 只用优点就好 类似 js精粹所说的

  • t   2013/11/25

    JavaScript 很萌的乃们表黑它

  • Yang   2013/11/29

    笑傻了,老外对技术的见解真是孤注一掷啊,走极端……那么为何不先擦干净屁股,先把自己的博客整好看一些呢

  • bombless   2013/12/05

    乱喷一通……现在有几个语言支持defer的?
    顺路顶golang一下。楼下可以喷喷golang,我围观就好。

    另外js有第一类函数和静态词法域,很容易基于事件来做defer。
    C++11的情况与此类似,而且C++还能搞模板库来做。Java 8的闭包暂时没深入了解。

  • 老三   2013/12/07

    世界上没有完美的东西,取其精髓,去其糟粕就好了。
    还有就是熟能生巧,一切操蛋的东西都可以通过自己的聪明才智得到解决。
    与其埋怨别人,不如自己构建一个自己觉得很爽的库。

  • 小个   2013/12/09

    看了此文跟没看差不多,说的都是众所周知的不足。。8个字:放大不足,回避优点

  • zzz   2013/12/09

    好好的一盘菜,博主专捡shi来吃

  • 123   2014/02/27

    都喜欢喷java,可是当你用php和js用多了,才觉得java原来也这么好。

  • 食优客   2016/03/04

    楼主说了这么多,只是对JS不熟悉,上面很多问题,都通过写法可以避免

  • Dapper   2016/08/13

    然而javascript应该遵循其本身的定位,作为浏览器脚本,和html深入结合,而不是一味跑到后端去干不是自己的活。

    一个显然的区别,后端对文件读取的代价相对较小,并且与操作系统密切结合,重视长期效率,并且持久运行;而前端对文件读取的代价大,效率低,讲求跨平台,重视首显响应,并且运行是一过性的

跳到底部
返回顶部