javascript eval和JSON之间的联系


Posted in Javascript onDecember 31, 2009

如果您想详细了解eval和JSON请参考以下链接:

eval  :https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval

JSON:http://www.json.org/

eval函数的工作原理

eval函数会评估一个给定的含有JavaScript代码的字符串,并且试图去执行包含在字符串里的表达式或者一系列的合法的JavaScript语句。eval函数将把最后一个表达式或者语句所包含的值或引用作为返回值。

举例说明

  • eval评估JavaScript表达式
var bar = 'bar';
var foobar = eval('"foo" + bar');
alert(foobar);
  • eval评估JavaScript语句
var bar = 'bar';
// if variable bar equals 'bar', foobar is the result of 
// last executing statement: bar="foo-bar";
var foobar = eval('if(bar == "bar") {bar="foo-bar";} else {bar = "bar-foo";}');
alert(foobar);// change the valuebar = 'foo';
// now our the last executed statement is: bar = "bar-foo";
// therefore the value of variable foobar has been changed
// into 'bar-foo'
foobar = eval('if(bar == "bar") {bar="foo-bar";} else {bar = "bar-foo";}');
alert(foobar);

JSON的格式

JSON的格式是由大括号和由冒号(:)构成的名值对所组成的。注意JSON格式与对象字面量 (object literals) 的区别:JSON的名字部分严格用引号+名字来表示。

举例说明

  • 对象的字面量
var objectLiteral = {
name: "Objector.L",
  age: "24",
  special: "JavaScript",
  sayName: function() {
return this.name;
}
};
  • JSON对象
var jsonFormat = {
  "summary": "Blogs",
  "blogrolls": [
{
       "title": "Explore JavaScript",
 "link": "http://example.com/"
    },
    { 
 "title": "Explore JavaScript",
 "link": "http://example.com/"
    }
]
};

eval和JSON

由于Ajax的兴起,JSON这种轻量级的数据格式作为客户端与服务器之间的传输格式逐渐地流行起来,进而出现的问题是如何将服务器端构建好的JSON数据转化为可用的JavaScript对象。利用eval函数无疑是一种简单而直接的方法。在转化的时候需要将JSON字符串的外面包装一层圆括号:

var jsonObject = eval("(" + jsonFormat + ")");

为什么要加括号?

加上圆括号的目的是迫使eval函数在评估JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:

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

JSON格式的名字部分为什么要加引号?

因为eval函数会将{foo:”bar”}解释成合法的JavaScript语句,而非表达式。但是人们往往想要的是让eval将这段代码解释成一个对象。所以JSON格式会强制你去在名字的外侧加上引号再结合圆括号,这样eval就不会错误的将JSON解释成代码块。

举例说明

  • eval错误解析语义
alert(eval('{foo:"bar"}'));   // return "bar", incorrect
  • eval正确解析JSON
alert(eval('({"foo": "bar"})')); // return JSON object, correct

结论

理解eval的工作原理和json的严格的限定格式,合理结合eval和json应用于JavaScript的数据传递和对象转换。

following this format:

eval('{' + jsonString + ')');
Javascript 相关文章推荐
Jquery 表单取值赋值的一些基本操作
Oct 11 Javascript
jQuery DOM操作小结与实例
Jan 07 Javascript
前端开发必须知道的JS之原型和继承
Jul 06 Javascript
一步一步制作jquery插件Tabs实现过程
Jul 06 Javascript
javascript 防止刷新,后退,关闭
Aug 07 Javascript
JQuery 中几个类选择器的简单使用介绍
Mar 14 Javascript
在jQuery中 关于json空对象筛选替换
Apr 15 Javascript
Jquery中"$(document).ready(function(){ })"函数的使用详解
Dec 30 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
Mar 24 Javascript
跟我学习javascript的prototype使用注意事项
Nov 17 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
Nov 26 Javascript
JQuery.validationEngine表单验证插件(推荐)
Dec 10 Javascript
js下用gb2312编码解码实现方法
Dec 31 #Javascript
JavaScript 学习笔记(七)字符串的连接
Dec 31 #Javascript
JavaScript 学习笔记(六)
Dec 31 #Javascript
JavaScript 学习笔记(五)
Dec 31 #Javascript
JavaScript 学习笔记(四)
Dec 31 #Javascript
javascript showModalDialog模态对话框使用说明
Dec 31 #Javascript
javascript控制frame,iframe的src属性代码
Dec 31 #Javascript
You might like
php mysql数据库操作类
2008/06/04 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
ThinkPHP控制器详解
2015/07/27 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
Thinkphp5.0框架视图view的模板布局用法分析
2019/10/12 PHP
jquery 学习笔记一
2010/04/07 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
Python实现单词翻译功能
2017/06/06 Python
Python编程之string相关操作实例详解
2017/07/22 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
Python datetime模块使用方法小结
2020/06/18 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
Python对excel的基本操作方法
2021/02/18 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
UGG英国官方网站:UGG UK
2018/02/08 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
信息与计算科学专业推荐信
2014/02/23 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫