在这里我主要说明两个方法,一个是eval ;另一个是decode;
eval:先看一个简单的例子:
<html>
<body>
<script type="text/javascript">
eval("x=10;y=20;document.write(x*y)")
document.write("<br />")
document.write(eval("2+2"))
document.write("<br />")
var x=10
document.write(eval(x+17))
document.write("<br />")
eval("alert('Hello world')")
</script>
</body>
</html>
运行结果:
200
4
27
弹出helloword对话框
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
然而估计见的最多的地方便是在ajax在处理返回值(通常是json格式)时用的;那么他究竟起啦什么作用?
以前只是知道eval 是将后台传的json串;转化为js对象;
问题1:一定要用eval吗?
答:当然不是;例如:extjs中的rest风格就指明啦请求与接收的数据类型(一般都指明为json);就不需要eval啦;再来说说那是如何解析json串的吧!
var dataObj=eval("("+data+")");//转换为json对象
为什么要 eval这里要添加 “("("+data+")");//”呢?
原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语 句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始 和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]
spring代码:
@RequestMapping(value = "/getColumnData.json", method = RequestMethod.GET)
public List<Object> getColumnData(){
System.err.println("...");
List<Object> list=new ArrayList<Object>();
list.add("{name:'北京',data:1330}");
list.add("{name:'上海',data:6330}");
list.add("{name:'广州',data:3330}");
list.add("{name:'武汉',data:1890}");
list.add("{name:'天津',data:1690}");
list.add("{name:'济南',data:1450}");
list.add("{name:'南京',data:1330}");
list.add("{name:'厦门',data:3343}");
return list;
}
extjs代码:
var columnStore1 = Ext.create('Ext.data.JsonStore', {
fields : [ 'name', 'data' ],
data : getColumnData()
/*
*这些是原始数据所做的一切就是将这些data
*从后台给传递进来
* data : [ {
name : '北京',
data : 1330
}, {
name : "上海",
data : 6330
}, {
name : "广州",
data : 3330
}, {
name : "武汉",
data : 1890
}, {
name : "天津",
data : 1690
}, {
name : "济南",
data : 1450
}, {
name : "南京",
data : 1330
}, {
name : "厦门",
data : 3343
} ]
数据解析时看做对象来处理的
*
这是用firebug调试时;看到store里面的所有data都是object;就是说明是可以通过.运算符来获取属性值的;
如果仅仅是用eval来解析的话;raw是一个字符串;
raw: Object
data: 1890
name: "武汉"
*
*/
});
function getColumnData() {
var resultData;
Ext.Ajax.request({
url : "http://localhost:8080/zutnlp-display/column/getColumnData.json",
async : false,// ASYNC 是否异步( TRUE 异步 , FALSE 同步)
success : function(response) {
var result = eval("(" + response.responseText + ")");
var text = result['objectList'];
console.log(text.name+"..."+text.data);//控制台报未定义
resultData = text;
}
});
var resultArray = new Array();
Ext.Array.each(resultData, function(value) {
var obj = Ext.JSON.decode(value);
console.log(obj.name+"..."+obj.data);
// console.log('name: '+value['name'] +'....data: '+value['data']);这样是可以取到的
resultArray.push(obj);
});
return resultArray;
//return resultData;
}
Ext.onReady(function() {
var b2 = Ext.create('Ext.Window', {
width : 600,
height : 400,
hidden : false,
closeAction : 'hide',
maximizable : true,
title : '柱形图展示图表',
layout : 'fit',
items : {
id : 'chartCmp',
xtype : 'chart',
style : 'background:#fff',
animate : true,
shadow : true,
store : columnStore1,
axes : [ {// 轴
type : 'Numeric',
position : 'left',
fields : [ 'data' ],
title : '人数',
grid : true,
minimum : 0
}, {
type : 'Category',
position : 'bottom',
fields : [ 'name' ],
title : '城市'
} ],// 序列
series : [ {
type : 'column',
axis : 'left',
highlight : true,
tips : {// 提示
trackMouse : true,
width : 140,
height : 28,
renderer : function(storeItem, item) {
this.setTitle(storeItem.get('name') + ': '
+ storeItem.get('data') + ' 名');
}
},
// 格式化
renderer : function(sprite, record, attr, index, store) {
var fieldValue = Math.random() * 20 + 10;
var value = (record.get('data') >> 0) % 3;
var color = [ 'rgb(213, 70, 121)', 'rgb(44, 153, 201)',
'rgb(146, 6, 157)', 'rgb(49, 149, 0)',
'rgb(249, 153, 0)' ][value];
return Ext.apply(attr, {
fill : color
});
},
label : { // 控制柱形图label
display : 'insideEnd',
'text-anchor' : 'middle',
field : 'data',
renderer : Ext.util.Format.numberRenderer('0'),
orientation : 'vertical',
color : '#333'
},
xField : 'name',
yField : 'data'
} ]
}
});
b2.show();
});