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 相关文章推荐
去除链接虚线全面分析总结
Aug 15 Javascript
prototype 1.5相关知识及他人笔记
Dec 16 Javascript
JavaScript中的对象化编程
Jan 16 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
Feb 03 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
Nov 25 Javascript
js 获取、清空input type="file"的值(示例代码)
Dec 24 Javascript
jQuery实现鼠标可拖动调整表格列宽度
May 26 Javascript
js获取日期:昨天今天和明天、后天
Jun 11 Javascript
JavaScript限定图片显示大小的方法
Mar 11 Javascript
vue自定义指令的创建和使用方法实例分析
Dec 04 Javascript
JavaScript设计模式之策略模式实现原理详解
May 29 Javascript
JavaScript实现队列结构过程
Dec 06 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/01 无线电
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
PHP 采集程序 常用函数
2008/12/18 PHP
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
php blowfish加密解密算法
2016/07/02 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
Python实现选择排序
2017/06/04 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
Django中template for如何使用方法
2021/01/31 Python
使用纯HTML5编写一款网页上的时钟的代码分享
2015/11/16 HTML / CSS
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
怎么写自荐书范文
2014/02/12 职场文书
公司员工活动策划方案
2014/08/20 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
初中家长评语大全
2014/12/26 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
Python基础详解之描述符
2021/04/28 Python
超详细Python解释器新手安装教程
2021/05/10 Python
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js