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 相关文章推荐
javascript Array 数组常用方法
Apr 05 Javascript
《JavaScript函数式编程》读后感
Aug 07 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
Mar 17 Javascript
微信小程序 获取微信OpenId详解及实例代码
Oct 31 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
Nov 30 Javascript
JS简单实现表格排序功能示例
Dec 20 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
Apr 13 Javascript
Vue.js弹出模态框组件开发的示例代码
Jul 26 Javascript
基于JavaScript表单脚本(详解)
Oct 18 Javascript
vue 解决IOS10低版本白屏的问题
Nov 17 Javascript
vue+element table表格实现动态列筛选的示例代码
Jan 14 Vue.js
JavaScript高级程序设计之基本引用类型
Nov 17 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
php检查字符串中是否有外链的方法
2015/07/29 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
让焦点自动跳转
2006/07/01 Javascript
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
html向js方法传递参数具体实现
2013/08/08 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
2018/02/04 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
js实现鼠标单击Tab表单切换效果
2018/05/16 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
十八届三中全会感言
2014/03/10 职场文书
校园文明标语
2014/06/13 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
爱心助学感谢信
2015/01/21 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
python 实现两个变量值进行交换的n种操作
2021/06/02 Python
js基础语法与maven项目配置教程案例
2021/07/15 Javascript