您的位置:

首页 >

网络编程 >

Javascript 计算字符串在localStorage中所占字节数 >

Javascript 计算字符串在localStorage中所占字节数

2016-03-01 04:40:31

分类:网络编程

最近项目有个需求要用js计算一串字符串写入到localStorage里所占的内存,众所周知的,js是使用Unicode编码的。而Unicode的实现有N种,其中用的最多的就是UTF-8和UTF-16。因此本文只对这两种编码进行讨论。下面这个定义摘自维基百科(http://zh.wikipedia.org/zh-cn/UTF-8),做了部分删减。UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,可以表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII相容,使用一至四个字节为每个字符编码其编码规则如下:字符代码在000000 – 00007F之间的,用一个字节编码;000080 – 0007FF之间的字符用两个字节;000800 – 00D7FF 和 00E000 – 00FFFF之间的用三个字节,注: Unicode在范围 D800-DFFF 中不存在任何字符;010000 – 10FFFF之间的用4个字节。而UTF-16 则是定长的字符编码,大部分字符使用两个字节编码,字符代码超出 65535 的使用四个字节,如下:000000 – 00FFFF 两个字节;010000 – 10FFFF 四个字节。一开始认为既然页面用的是UTF-8编码,那么存入localStorage的字符串,应该也是用UTF-8编码的。但后来测试发现,明明计算出的size是不到5MB,存入localStorage却抛异常了。想了想,页面的编码是可以改的。如果localStorage按照页面的编码存字符串,不就乱套了?浏览器应该都是使用UTF-16编码的。用UTF-16编码计算出5MB的字符串,果然顺利写进去了。超过则失败了。好了,附上代码实现。计算规则就是上面写的,为了计算速度,把两个for循环分开写了。/** * 计算字符串所占的内存字节数,默认使用UTF-8的编码方式计算,也可制定为UTF-16 * UTF-8 是一种可变长度的 Unicode 编码格式,使用一至四个字节为每个字符编码 * * 000000 - 00007F(128个代码) 0zzzzzzz(00-7F) 一个字节 * 000080 - 0007FF(1920个代码) 110yyyyy(C0-DF) 10zzzzzz(80-BF) 两个字节 * 000800 - 00D7FF 00E000 - 00FFFF(61440个代码) 1110xxxx(E0-EF) 10yyyyyy 10zzzzzz 三个字节 * 010000 - 10FFFF(1048576个代码) 11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz 四个字节 * * 注: Unicode在范围 D800-DFFF 中不存在任何字符 * {@link http://zh.wikipedia.org/wiki/UTF-8} * * UTF-16 大部分使用两个字节编码,编码超出 65535 的使用四个字节 * 000000 - 00FFFF 两个字节 * 010000 - 10FFFF 四个字节 * * {@link http://zh.wikipedia.org/wiki/UTF-16} * @param {String} str * @param {String} charset utf-8, utf-16 * @return {Number} */ var sizeof = function(str, charset){ var total = 0, charCode, i, len; charset = charset ? charset.toLowerCase() : ''; if(charset === 'utf-16' || charset === 'utf16'){ for(i = 0, len = str.length; i < len; i++){ charCode = str.charCodeAt(i); if(charCode <= 0xffff){ total += 2; }else{ total += 4; } } }else{ for(i = 0,

本文实例分析了Javascript字符串浏览器兼容问题。分享给大家供大家参考。具体分析如下:先看下不兼容的写法,若我想获取某个字符串的第几位复制代码 代码如下:var str='aavvvcc';console.info(str[0]);这种写法 在IE 7以下的浏览器都不兼容,以下提供浏览器全兼容的方式复制代码 代码如下:var str='aavvvcc';console.info(str.charAt(1));使用charAt() 就可以获取字符串中某个字符,并且全部兼容。希望本文所述对大家的javascript程序设计有所帮助。

复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jQuery+JavaScript 实现 table 的增加和减少</title> <script language="javascript" src="jquery-1.7.1.min.js"></script> </head> <body> <p><input type="text" value="请输入邮箱地址" id="email" id="email" /></p> <p><input type="button" value="提交" /></p> <script type="text/javascript"> $("#email").focus(function(){ var email_txt = $(this).val(); if (email_txt == this.defaultValue) { $(this).val(""); } }) $("#email").blur(function(){ var email_txt = $(this).val(); if (email_txt == "") { $(this).val(this.defaultValue); } }) </script> </body> </html> 效果预览:

确定要放在Head部分 ?事实上最好的情况是,js文件都不要在<head>部分进行加载,否则会影响到head部分的载入速度,直接导致网站的内容(body)载入延迟。如果你确定你不需要在head部分载入jQuery,请将载入代码移动到</body>前,准确的说是第一个会用到jQuery函数的javascript代码前。当然,如果你需要head部分加载jquery,也请确保所有的js文件,包括jquery,都要放在调用CSS文件的代码之后,来实现同步下载。这也是Google官方给出的建议。例如下面的加载不推荐:<script src=jquery.js></script><link href="style.css" .../>而是应该使用:<link href="style.css" .../><script src=jquery.js></script>确定不要异步加载 ?异步加载不会阻塞网页的载入,而非异步加载则会在加载本身js之前短暂阻塞浏览器的网页载入。这可能影响浏览体验。如果你的加载代码是<script type="text/javascript" src="jquery.js"></script>那么你需要知道这可不是异步加载的方式,这是一种同步加载。如果你不需要在页面加载后及时的调用jquery函数,你完全可以用异步加载的方式,使得网页onload之前才加载jquery,大大加快载入速度。这样的代码看起来像是Google Analytics的代码。(function(doc){var j =doc.createElement("script");j.type = "text/javascript"; j.async = true; j.src = "jquery.js";var s = doc.getElementsByTagName("script")[0];s.parentNode.insertBefore(j, s);})(document);但是经我观察,大多数的时候我们需要同步加载,尤其是你还需要引入jQuery插件的时候。使用哪个版本的jQuery ?wordpress总是自带最新的jQuery库,每一个版本的使用方法总有细微的不同。越新的jQuery版本,性能提升也越高。不过,某些jquery插件可能不太兼容太新的插件,而它自己也没有推出更新。也许有些你会使用的方法函数,到了新版本发现已经被改变,曾经能工作的现在已经不能了。对于这种情况,应该遵从这样的原则,那就是在确保兼容性的同时,做到使用尽可能新的jQuery库。例如你以前使用1.6.2版本的jquery,到了现在你发现2.X某些函数有改变,你又不愿意去变更代码,就最好逐个调试,例如你发现1.7.2的兼容性就不错。这个时候就可以抛弃1.6.2,可以用1.7.2版本的jQuery去替换掉2.X的新版。使用哪个jQuery CDN库 ?jQuery实在是太大了!如果你的网站速度不是飞快,jquery肯定会影响到你的页面加载速度。好在百度、新浪、微软、Google等公司都推出了公共js库,方便网站主调用来缩短下载时间,而它们本身有着超快的CDN服务器,节约了下载时间。目前用的比较普遍的是Google提供的jquery库:<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>当然,百度在国内的访问速度是不可小视的:<script type="text/javascript" src="//libs.baidu.com/jquery/2.0.3/jquery.min.js"></script>新浪的CDN同样速度飞快:<script type="text/javascript" src="//lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></script>不跟风,你也可以选择微软的jquery CDN:<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>你可以直接更改上面出现的版本号来选择不同的版本。哪一个最快呢?如何选择呢?如果你的网站访客来自海外的不少,建议选用Google,如果主要访客是国内,选择百度也没问题。但是百度在海外的访问速度可不及Google。而且因为大多数的网站选择了Google的CDN,由于缓存原理,来访你的网站,可能google的CDN更快。如果你不是确定自己的网站下载速度飞快,我建议最好选用上述的公开CDN来节省加载时间,同时也节省了流量。真的要用jQuery吗?如果你的网站只是需要用带jquery一个很小的函数,为什么要下载这么大的文件呢?为什么不可以jquery-free?例如你可以考虑zepto.js,其设计目标“以最小的体积,做到最大兼容jQuery的API”。它在gzip压缩后仅仅为10KB。另外,jQuery有着模块设计,可以选择自己只是需要的模块。你可以参考jquery builder。加载jQuery的正确方式说了那么多,加载jquery的正确方式是什么?首先选好哪个CDN,或者你自己的网站托管js文件,并确定调用的位置在头部还是body,下面以Google的jquery库为例,普通的加载方式是<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>然而Google的服务在国内间歇性中断,所以我可以照顾一下国内访客,这么写:<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script><script type="text/javascript">window.jQuery || document.write(unescape('%3Cscript%20type%3D%22text/javascript%22%20src%3D%22//libs.baidu.com/jquery/2.0.3/jquery.min.js%22%3E%3C/script%3E'));</script>这样子即可实现如果jQuery未能加载成功,则自动加载百度的jquery库,做到万无一失了。

本文实例讲述了JavaScript通过字符串调用函数的实现方法。分享给大家供大家参考。具体分析如下:JavaScript中我们可以把根据函数名的字符串来调用函数,这样我们就可以实现动态函数调用,只需要传递一个函数的名字即可调用该函数。复制代码 代码如下:var strFun = "someFunction"; //Name of the function to be calledvar strParam = "this is the parameter"; //Parameters to be passed in function//Create the functionvar fn = window[strFun];//Call the functionfn(strParam); 下面是一个详细的调用实例复制代码 代码如下:<input type="text" id="functionName" name="functionName" size="20" value="fnFooBar">    <input type="text" id="functionParam" name="functionParam" size="30" value="Happy New Year.!!">    <input type="button" style="font-weight:bold" value="Call" onclick="javascript:call();">    <br>    <pre>    function fnFooBar(strVal) {            alert(strVal);            return 1;        }   </pre><br><script>function fnFooBar(strVal) {    alert(strVal);    return 1;}function call() {    var strFunctionName = document.getElementById("functionName").value;    var strFunctionParam = document.getElementById("functionParam").value;    var fn = window[strFunctionName]    var ret = fn(strFunctionParam);}</script>希望本文所述对大家的javascript程序设计有所帮助。

焦点访谈

最新最热的文章

更多 >

COPYRIGHT (©) 2017 Copyright ©2017 5060网址大全 网站地图

联系我们

827570882

扫描二维码分享到微信