我为什么不用JScript?

标签: , , ,

有网友在《利用WMI打造完美“三无”后门-The Core》中留言:

小建议, 楼主 所写vbs 完全可用 jscript 替代
js 轻易 超越 vbs 完成 很多高级应用
vbs 用到最后, 很反感它,
代码不能重用, 啰嗦, 不灵活, 开发效率低下 ….等

微软 故意不推广 jscript
很多的脚本例子 均用vbs 展示例子
估计很多VBSer 用熟练vbs到最后, 转向js时发现, 自己的青春 被M$故意浪费了
走了很多的弯路 在vbs上

首先声明一下这里的JScript指的是在Windows脚本宿主(Windows Script Host,即wscript.exe和cscript.exe)中运行的JScript,不要和网页客户端脚本JavaScript混为一谈。

微软当年推出VBScript的一个初衷是与JavaScript竞争网页客户端脚本,但是很显然VBScript完败了,当今的WEB是JavaScript的天下,傻逼才用IE Only的VBScript开发网页。那位网友说的“估计很多VBSer 用熟练vbs到最后, 转向js时发现, 自己的青春 被M$故意浪费了”大概说的就是那些曾经用VBScript开发网页的人吧。

但是在Windows Script Host中,我不觉得VBScript比JScript差得了多少。我不曾见过Windows脚本宿主的高级应用,更不知道那位网友用轻易超越VBS的JS写了哪些高级应用,但是他所说的“代码不能重用, 啰嗦, 不灵活, 开发效率低下”,我是不敢苟同的。

代码不能重用

维基百科中说:“所谓的代码复用,本质上就是对曾经编写过的代码的一部分甚至全部重新加以利用,从而构建新的程序。”比如说我曾经写过一个VBS解析JSON的VbsJson类,下次我想解析JSON数据的时候加以利用,这难道不算代码重用?如果这样不算,怎样才算代码可以重用?

啰嗦

在WSH中经常要做的一件事情是遍历集合,在VBScript中使用For Next循环即可轻松实现,而JScript的for in循环却不支持集合,我们不得不另外构造一个Enumerator对象:

'By Demon
'https://demon.tw
Dim fso, d
Set fso = CreateObject("Scripting.FileSystemObject")
For Each d In fso.Drives
    WScript.Echo d.DriveLetter
Next
// By Demon
// https://demon.tw
var fso, e, x;
fso = new ActiveXObject("Scripting.FileSystemObject");
e = new Enumerator(fso.Drives);
for (; !e.atEnd(); e.moveNext())
{
    x = e.item();
    WScript.Echo(x.DriveLetter);
}

哪个比较啰嗦?

不灵活

VBScript的确在很多方面不如JScript灵活,比如自定义函数不支持变长参数和默认参数,循环体中没有continue,为对象赋值需要用Set关键字等等,但是在处理字节数组Byte()时JScript就显得力不从心了:

'By Demon
'https://demon.tw
Dim ado, s, i
Set ado = CreateObject("ADODB.Stream")
ado.Type = 1
ado.Open
ado.LoadFromFile "binary.dat"
s = ado.Read
For i = 1 To LenB(s)
    WScript.Echo AscB(MidB(s, i, 1))
Next
// By Demon
// https://demon.tw
var ado, s;
ado = new ActiveXObject("ADODB.Stream");
ado.Type = 1;
ado.Open();
ado.LoadFromFile("binary.dat");
s = ado.Read();
// 请问如何处理?

虽然我想出了一种变通的方法,但是代码冗长并且效率低下。

开发效率低下

你可以说我上面写的都是强词夺理,但是就开发效率而言,VBScript绝对比JScript要高。因为VBScript有编辑神器——VbsEdit,而在网上我找不到一个能与之匹敌的JScript编辑器。不要向我推荐Aptana之类的JavaScript编辑器,前面强调过了,本文说的是JScript,那些不能自动完成COM对象的属性和方法的JavaScript编辑器有何用?

找不到像样的编辑器,这是我不用JScript最主要的原因,我没有那么多时间一个字母一个字母的敲。我曾经尝试过自己开发一个JScript编辑器,但是由于JScript是动态的弱类型语言,想静态分析每个变量的类型十分的困难,远远超出我的能力范围,只好作罢。当然,那位网友说不定早就已经开发出了超越VbsEdit的JScript编辑器,所以才说VBScript开发效率低下。

结语

VB一族(VB、VB.NET、VBA、VBS)似乎从诞生之日起就受到人们的鄙夷和唾弃,被认为是初学者的玩具;而那些C一族(C、C++、C#、Java,这里仅从语法上分类)似乎就有天生的优越感,特别是C++,更是不可一世。

讨论哪种语言最好是没有意义的,事实上,你可以用任何语言写出糟糕的代码。早在COBOL流行的时候,人类就已经登上了月球,可见如果不是把精力花在争论语言的孰优孰劣的话,就可以做很多事情。

赞赏

微信赞赏支付宝赞赏

随机文章:

  1. 用VBS压缩ZIP文件
  2. _get_osfhandle函数
  3. NDS模拟器Dualis
  4. WriteFile,WriteConsole和_tprintf的一些差别
  5. VBS统计字符串全部字符出现的次数并排序

15 条评论 发表在“我为什么不用JScript?”上

  1. 菊草叶说道:

    因为你是外星人~

  2. Zerovos说道:

    个人还是顶下博主,VBS很好啊,
    语言都是有优缺点的,算法才是王道。

  3. imFan说道:

    希望大大能写一个vbs或asp的redis驱动,又或者提供一个想法。

    我目前遇到的难题主要在中文上。

    存入中文到redis里 实际它是以:\x64\x65\x6D\x6F\x6E\x2E\x74\x77的形式存入的。
    但又不知道 如何以这种形式来存。

    所以希望大大能有一篇这样的文章咯~

  4. prophetk说道:

    这种争论 没什么意义吧 能实现就可以了 就像争论汉语和英语哪个更完美 黄人和白人哪个更优越一样 变量 判断 循环 函数 对象与类 有什么不同

  5. break说道:

    所有人类创造的东西都是为了解决问题。

  6. ssln说道:

    jscript/vbscript貌似没有javascript+php流行啊

  7. 路过说道:

    “虽然我想出了一种变通的方法,但是代码冗长并且效率低下。”
    获取文件大小然后……?
    为何不用while或者try?
    当然,我是最坚定的VBS爱好者,JScript也间或有所涉猎。

  8. 叶子说道:

    如果以文本形式打开文件算不算?

    var ado, s;
    ado = new ActiveXObject(“ADODB.Stream”);
    ado.Type = 2;
    ado.Charset = “ASCII”;
    ado.Open();
    ado.LoadFromFile(“binary.dat”);
    s = ado.ReadText();
    // 请问如何处理?
    for(i=0;i<s.length;i++)
    {
    WScript.Echo(s.substr(i,1).charCodeAt());
    }

    • 叶子说道:

      麻烦了,这样写就行:WScript.charCodeAt(i);
      试了一下,遇到中文输出不对
      看来还是VBS是微软亲生的

  9. Frank说道:

    不要把VB与其他语言对立起来——话说Java和C/C++、Java和JavaScript,甚至C和C++的开发者也都经常互相看不顺眼。
    VB最大的问题是,缺乏一个完整一致的模式。过程式也好,面向对象也好,基于对象和接口的封装也好,都缺乏贯彻始终的完整一致的模式。微软用.net全面替代了VB也可以印证了官方态度。
    VBS为了继承VB/VBA的开发者,就更是迫不得已继承了许多VB的方式,所以方便有余,底蕴不足。按楼主说的,做几行的Script时候短平快,一旦想开发像样的东西的时候,就处处制肘。
    JavaScript其实在语言本身,是一个脱离了Java语法的高度抽象代理模式。这一方面使得语言性能受限,但是也使得语言带有极大灵活性。从现在H5和Node的蓬勃生机就能印证它的良好架构带来的活力。
    不过各个技术都有适合的地方,楼主的需求只是像Office的宏那样短小精悍的Script,不用结构,不要重用,那么或许VBS的确是最好的选择。

  10. UMU说道:

    VBS 性能很多时候高于 JScript

留下回复