入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

JS客户端获取服务端返回数据方法总结

创建时间:2016-09-25 投稿人: 浏览次数:2686

在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 

1.一种为使用eval()函数。 
2. 使用Function对象来进行返回解析。 


一、使用eval函数来解析,并且使用jquery的each方法来遍历 

1)首先我们来认识下eval()这个函数。

定义:W3C给出的标准定义是:eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。(脑洞:有时甚至可以把js代码写到文件或者数据库等一些存储中,读出来以后用eval执行即可) 用法:eval("str") 但是一般情况下,在str有可能为表达式的情况的时候,我们都会使用eval("("+str+")")                这里为什么要加()呢?          eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。 
         加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。     例: alert(eval("{}");   // return undefined 
     alert(eval("({})");// return object[Object]  安全性:eval只是一个普通的函数,只不过他有一个快速通道通向编译器,可以将string变成可执行的代码。有类似功能的还有Function , setInterval 和 setTimeout。 1、 可读性非常差。 2、增加性能消耗。js很脏,所以写js代码的时候我们需要非常注意内存的使用。而eval会把上下文变量强行留住。
3、不好再做优化和编译。(修改作用域 ,编译时预先确定的变量及函数位置失效,所做的优化就浪费了)
4、不安全。比如:eval input的值等容易引起XSS攻击。不过实际上,如果我们对信息源有足够的把握时,eval并不会引起很大的安全问题。而且不光是eval,其他方式也可能引起安全问题。比如:莫名其妙给你注入一个<script src="">标签,或者一段来历不明的JSON-P请求,再或者就是Ajax请求中的eval代码…所以啊,只要信息源不安全,代码就不安全。不单单是因为eval引起的。

2)与JSON.parse()、parseJSON的区别。

eval:将可执行的字符串转js代码并执行(比如:alert(eval("1+1"));)
JSON.parse:将"json"字符串(或不规则对象)转成对应的对象或集合。
parseJSON:JSON.parse对应的JQuery函数。 其实JS内置的 JSON.parse 内部也是用 eval,包括 jQuery 的 parseJSON 也用 eval,只是做了一些相应的数据格式的限制。

3)使用jquery的each方法来遍历。

alert(dataObj.length);//输出子对象数量 
$.each(dataObj,fucntion(idx,item){ 
if(idx==0){ 
return true; 
} 
//输出每个子对象的名称和值 
alert("name:"+item.name+",value:"+item.value); 
}) 
注:对于一般的js生成json对象,只需要将$.each()方法替换为for语句即可,其他不变。

二、使用Function对象来解析

对于使用Function对象来解析数据,典型应用就是在JQuery中的AJAX方法下的success等对于返回数据data的解析了,当然$.getJSON、$.get、$.post其实也是$.ajax方法的一种。对于服务器返回的JSON字符串,如果jquery异步请求将type(一般为这个配置属性)设为“json”,或者利用$.getJSON()方法获得服务器返回,那么就不需要eval()方法了,因为这时候得到的结果已经是json对象了,只需直接调用该对象即可,这里以$.getJSON方法为例说明数据处理方法: 
$.getJSON("localhost",{param:"xiepeng"},function(data){ 
<span style="white-space:pre">	</span>//此处返回的data已经是json对象 
<span style="white-space:pre">	</span>//以下其他操作同第一种情况 
<span style="white-space:pre">	</span>$.each(data,function(idx,item){ 
<span style="white-space:pre">		</span>if(idx==0){ 
<span style="white-space:pre">		</span>return true;//同countinue,返回false同break 
<span style="white-space:pre">		</span>} 
<span style="white-space:pre">		</span>alert("name:"+item.name+",value:"+item.value); 
<span style="white-space:pre">	</span>}); 
}); 


当然也可以自定义函数,如:
var json="{"name":"XP","age":24}"; 
data =(new Function("","return "+json))(); 



声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。