加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 创业 > 模式 > 正文

JavaScript优化篇:BASE64极速版

发布时间:2018-08-19 13:55:08 所属栏目:模式 来源:站长网
导读:烈火网(LieHuo.Net)教程 BASE64原理很简单,但要写出一个高效的,尤其是用JS这样高灵活低效率的脚本,还需斟酌一翻。 先看看网上比较流行的版本。首先声明64个常量字符: 这一步大家都一样,也没有更好的方法列出这些字符。但接下来的做法,就大有讲究了。

  烈火网(LieHuo.Net)教程 BASE64原理很简单,但要写出一个高效的,尤其是用JS这样高灵活低效率的脚本,还需斟酌一翻。

  先看看网上比较流行的版本。首先声明64个常量字符:

  这一步大家都一样,也没有更好的方法列出这些字符。但接下来的做法,就大有讲究了。因为这里的key是一个String,所以各个版本里都大量充斥着charAt,甚至indexOf函数来操作这个key。用charAt来访问key的第n个字符,这还在清理之中;但用indexOf来确定字符的位置,就不可原谅了。在VBScript里倒还能凑合着用,但在JS里这种做法是很糟糕的,显然没有把其灵活性发挥出来。何谓灵活性,用最短的话说就是多用哈希表。哈希表是JS与生俱来就有的东西,其效率是其他方法都不能相比的。显然,在BASE64这样数字与字符频繁转换的算法里,hash是该大显身手的。

  再谈charAt的问题。charAt虽然不会像indexOf那样效率数量级的下降,但也不是最优秀的。脚本程序分两类,一类是自己写的,另类就是系统内置在浏览器中的,就是所谓的[Native Code]。后者的效率当然是远高于前者,这大家都知道。所以尽可能多让代码交给系统执行,有时看起来可能计算量变大了,但最终的速度反倒提升了。

  就说BASE64解码的过程,参数是个String,按常规的方法就是先charAt其每个字符。如果有1万个字符,那么charAt也就运行了1万次。能否将多次charAt函数的执行合并到1次本地代码的调用上呢,当然可以:

  var arr = str.split('');

  之后的str.charAt(i)就可以用arr[i]代替了。此方法虽多开辟的一块内存,但最终的效率还是有所提高,并且增强了代码可读性。当然,在运行速度极快的浏览器比如FireFox,Chrome就没什么区别,甚至还可能倒退。

  最后就是一个层次上的问题。网上常有人在说BASE64如何支持中文。按照这种说法,BASE64用来编码解码字符串了,这与其意义多少有些偏离。BASE64的最初就是将二进制文件转成可见字符,在邮件里发送。因此其意义就在于二进制与字符的转换,而不是字符与字符的转换。JS没有二进制,但可以用0-255的数组来模拟。所以:

  function 编码函数(Array[]){return String;}

  function 解码函数(String){return Array[];}

  至于中文的问题,无非就是Unicode与ANSI的转换。JS貌似没有现成的转换函数,若要实现可以用Unicode与ANSI的对照表。但双方的编码/解码都统一使用Unicode,也就

  不存在支不支持的问题了。

  最终的代码:

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读