javascript基础知识系列:eval()

  在用ztree.js做商品分类树状显示时遇到了JSON数据转换的问题,发现可以用eval做处理,在网上找资料学习了下:

 

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

语法:

eval(string):    string    必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句

 

返回值

通过计算 string 得到的值(如果有的话)。

说明

该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。

 

在解析JSON格式的数据时:如果服务器返回的是JSON字符串,需要将JSON字符串转换成JSON对象

View Code
  var o={name:"张三", age:19}; //此处o是js对象 ,对象字面量
  alert(o.name);

  //此时的str_json才是json类型的字符串
  var str_json = '{"name":"张三", "age":19}'; //str_json是符合JSON规范的字符串
  var oJSON = eval('('+str_json+')'); //使用eval()把JSON字符串转化成js对象oJSON
  alert(oJSON.name); //张三

 

Red rose为什么要 eval这里要添加 “("("+data+")");//”呢?

原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。

加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个

例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下

面两个执行结果是不同的:

  alert(eval("{}"); // return undefined
  alert(eval("({})");// return object[Object] 

 

 

字符串转换成json的三种方式:

第一种:eval方式解析

 

 function strToJson(str){  
      var json = eval('(' + str + ')');  
      return json;  
 } 


第二种:new Function形式

 

function strToJson(str){
    var json = (new Function("return " + str))();
    return json;
}


第三种:使用全局的JSON对象

 

function strToJson(str){
    return JSON.parse(str);
}


另外:使用JSON.parse需严格遵守JSON规范,如属性都需用引号引起来,如下

 

var str = '{name:"jack"}';
var obj = JSON.parse(str); // --> parse error


name没有用引号引起来,使用JSON.parse所有浏览器中均抛异常,解析失败。而前两种方式则没问题

posted on 2012-08-09 11:39  color_story  阅读(289)  评论(0编辑  收藏  举报

导航