OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

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


分享到
分类 我要吐嘈   关键字 分享   发布 ourjs  1383318452000
注意 转载须保留原文链接,译文链接,作者译者等信息。  
昨天 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元素加样式的标准的流程:

<div class='<%= model.class %>' id='<%= [model.class, model.id].join %>' >…
在JS里是不可能的,因为只有’Object’,’function’和原始类型才有类型信息


到处是Null

不小心用错了一个常量

MyApp.SYNC // should have been MyApp.SYNC_FETCH


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


回调的深渊

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

var res = await AjaxReq.fetch('/long-request')
// because you are waiting for a result, here the runtime would
// schedule event handling, DOM redraws and whatever else it can
// squeeze in while you await
res.name // this will be only executed once res is available


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

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

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


when(<ERMAGHERD RIDICULOUSLY LONG CALLBACK>
 // 48 lines of code down
).then(<HOLYSHIT WHEN WILL THIS BE OVER>
// 23 lines down
).then(<GIVE ME SOME COFFEE ALREADY>)


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

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


可怕的异常处理机制

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

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


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

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

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

var cv = Marionette.CollectionView.extend({
itemView: MyApp.Views.WidgetView;
});
如果”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”。另外,他博客页脚不美观,占用空间过大,在原文评论中被很多读者吐槽了。当然了,也有热心网友在帮他出主意了。




原文地址: 点此
社区评论 ( Beta版 )
  • #0 尘缘而已 1387102282000
    难怪,一个写同步程序的写多了,碰上JS这种全异步回调的东东不吐嘈才怪 说到底还是没习惯。
  • #1 phper08 1397205804000
    一个劲的黑JS,还顺带黑了PHP,结果是吹捧Ruby!
  • #2 johnhax 1397645612000
    翻译有问题啊。
  • #3 侯耳仆 1415782997389

    没本事驾驭,吐槽的本事到是挺大的。这么喷的人,其实能力根本不行。

  • #4 sb 1484034708364

    @侯耳仆 说的是。

  • #5 史珍香 1494499503079

    为什么没人吐槽C和java呢?我就觉得这种老头用的计算语言该入土了. 强调一个事实,计算机语言是为了人民服务的,而不是为了折腾人类的. 你在优化算法?你在加班写BUG?是不是近视了?是不是掉头发了?是不是颈椎病了? 那就对了,你被计算机玩了. 计算机能做的,就别去人工做了,比如优化算法,比如优化存储,比如花几年学一门计算机语言,还tm学不透. 放弃吧,少年,哦老古董们. 人生苦短,写几十年的C就那样,成不了神的. 为了后人,求你们把C呀,java呀扔tm厕所里吧,好好研究一门适合人类使用的语言. 别自吹自雷了,认清现实吧,你们就是搬砖的. 你们搬一个月的砖没有大型机械一天的工作量多,别在自己的安逸区里面意淫了.

    说要有光就有光,这才是计算机的上帝

    你们现在只是奴隶

  • #6 叫我皮皮锤 1496197855701

    楼上的什么意思?

    我大JAVA招惹你了?

OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 为何程序员完成最后20%的工作需要的时间跟之前的80%一样多?
  2. 通过javascript把图片转化为字符画
  3. 一个女软件工程师的征婚PPT
  4. 够用即可:简单之美(Worse Is Better)
  5. 女子发帖赞扬IT男老公 网友纷纷求介绍
  6. 马化腾写代码的水平如何?
  7. 程序员必看的十大电影
  8. 对于现代开发来说,JavaScript就是一种垃圾语言
  9. 做个犀利的码农:如何持续培养/更新自己的开发技能
  10. 性能测评:Node.JS比Java EE快20%
  11. AirJD-简单好用的免费建站工具

 相关阅读 - 我要吐嘈
  1. 前Google员工们的吐槽:在Google打工所能遇到的最坏事
  2. 对于现代开发来说,JavaScript就是一种垃圾语言
  3. 我快成为了我一直讨厌的那种人
  4. 如此架构,泛滥架构,疯狂架构
  5. 亲爱的项目经理,我恨你
  6. 真的没必要浪费心思在 Go 语言上
  7. 别老扯什么Hadoop了,你的数据根本不够大
  8. 总结程序员各种致命土鳖穿着
  9. 关于 Internals 的闲话[php]

 关键字 - 分享
  1. 这些因素一直限制着小程序的发展!
  2. 用户使用小程序,必须知道这四个功能!
  3. 大数据平台架构技术选型与场景运用
  4. LEADTOOLS Multimedia SDK更新:改进RTSP和H.265/H.264的硬件加速
  5. 多个角度看小程序对企业的改变!
  6. 对于不同的APP,小程序的影响也是不同的!
  7. 这几款app自动化测试工具 你应该了解
  8. 从出现到现在,小程序带给企业的各种好处。
  9. 小程序的三个更新,会给企业带来巨大改变!
  10. 扫描识别控件Dynamic Web TWAIN 13.0发布,新增统一的Dynamsoft服务

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号