首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议146:使用自定义格式进行通信

关灯直达底部

最理想的数据格式只包含必要的结构,并且能够分解出每个字段。可以自定义一种格式,只简单地用一个分隔符将数据连接起来。


d;Tyler;John


这些分隔符基本上创建了一个数据数组,类似于一个逗号分隔的列表。通过使用不同的分隔符,可以创建多维数组。这里是用自定义的字符分隔方式构造的用户列表:


alice:Alice:[email protected];

bob:Bob:[email protected];

carol:Carol:[email protected];

dave:Dave:[email protected]


这种格式非常简洁,与其他格式相比(不包括纯文本),其数据/结构比例明显提高。自定义格式下载迅速,易于解析,只需调用字符串的split将分隔符作为参数传入即可。更复杂的自定义格式具有多种分隔符,需要在循环中分解所有数据。注意,在JavaScript中这些循环处理起来是非常快的。split是最快的字符串操作之一,通常可以在数毫秒内处理具有超过10 000个元素的由分隔符分割的列表。下面的例子给出解析上述格式的方法。


function parseCustomFormat(responseText){

var users=;

var usersEncoded=responseText.split(';');

var userArray;

for(var i=0,len=usersEncoded.length;i<len;i++){

userArray=usersEncoded[i].split(':');

users[i]={

id:userArray[0],

username:userArray[1],

realname:userArray[2],

email:userArray[3]

};

}

return users;

}


当创建自定义格式时,最重要的决定是采用何种分隔符。在理想情况下,分隔符应当是一个单字符,而且不能存在于数据之中。ASCII字符表中前面的几个字符在大多数服务器端语言中能够正常工作且容易书写。下面讲述如何在PHP中使用ASCII码。


function build_format_custom($users){

$row_delimiter=chr(1);///u0001 in JavaScript.

$field_delimiter=chr(2);///u0002 in JavaScript.

$output=array;

foreach($users as$user){

$fields=array($user['id'],$user['username'],$user['realname'],$user['email']);

$output=implode($field_delimiter,$fields);

}

return implode($row_delimiter,$output);

}


这些控制字符在JavaScript中使用Unicode标注(如/u0001)表示。split函数可以用字符串或正则表达式作为参数。如果希望数据中存在空字段,那么就使用字符串;如果分隔符是一个正则表达式,那么IE中的split将跳过相邻两个分隔符中的第二个分隔符。这两种参数类型在其他浏览器上等价。


var rows=req.responseText.split(//u0001/);

var rows=req.responseText.split("/u0001");


这是字符分隔的自定义格式的性能数据,使用XHR和动态脚本标签注入。

XHR和动态脚本标签注入都可以使用这种格式。在两种情况下都要解析字符串,在性能上没有实质上的差异。对于非常大的数据集,自定义格式是最快的传输格式,甚至可以在解析速度和下载时间上“击败”本机执行的JSON。用此格式向客户端传送大量数据只需要很少的时间。

总的来说,越轻量级的格式越好,最好是JSON和字符分隔的自定义格式。如果数据集很大或解析时间成问题,那么就使用以下两种格式之一:

❑JSONP数据,用动态脚本标签插入法获取。这种格式将数据视为可运行的JavaScript而不是字符串,解析速度极快。这种格式能够跨域使用,但不应涉及敏感数据。

❑字符分隔的自定义格式,使用XHR或动态脚本标签插入技术提取,使用split解析。此技术在解析非常大数据集时比JSONP技术略快,而且通常文件尺寸更小。注意,这些数据只是在一个浏览器上进行一次测试获得的。测试结果可用做大概的性能指标,而不是确切的数字。