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 相关文章推荐
JS 学习笔记 防止发生命名冲突
Jul 30 Javascript
JavaScript转换农历类实现及调用方法
Jan 27 Javascript
javascript基础之查找元素的详细介绍(访问节点)
Jul 05 Javascript
JavaScript面向对象编程入门教程
Apr 16 Javascript
jQuery实现自定义下拉列表
Jan 05 Javascript
延时加载JavaScript代码提高速度
Dec 27 Javascript
jQuery限制图片大小的方法
May 25 Javascript
JS数组去掉重复数据只保留一条的实现代码
Aug 11 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
May 14 Javascript
详解react native页面间传递数据的几种方式
Nov 07 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
Apr 28 Javascript
Javascript中的解构赋值语法详解
Apr 02 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上传文件的增强函数
2010/07/21 PHP
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
php流量统计功能的实现代码
2012/09/29 PHP
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
Python通过解析网页实现看报程序的方法
2014/08/04 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
浅谈Python中copy()方法的使用
2015/05/21 Python
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
Python将string转换到float的实例方法
2019/07/29 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
Python字典的概念及常见应用实例详解
2019/10/30 Python
keras中的backend.clip用法
2020/05/22 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
Linux中如何用命令创建目录
2016/12/02 面试题
金融专业个人的自我评价
2013/10/18 职场文书
小学节能减排倡议书
2014/05/15 职场文书
优秀党员申报材料
2014/12/18 职场文书
质检员岗位职责
2015/02/03 职场文书
中秋节寄语2015
2015/03/24 职场文书
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python