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 相关文章推荐
通过onmouseover选项卡实现img图片的变化
Feb 12 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
Nov 09 Javascript
AngularJS基础 ng-value 指令简单示例
Aug 03 Javascript
JS图片放大效果简单实现代码
Sep 08 Javascript
详细总结Javascript中的焦点管理
Sep 17 Javascript
基于JavaScript实现自动更新倒计时效果
Dec 19 Javascript
vue.js实现含搜索的多种复选框(附源码)
Mar 23 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
Nov 10 jQuery
解析Vue 2.5的Diff算法
Nov 28 Javascript
Angular 容器部署的方法
Apr 17 Javascript
详解JavaScript的变量
Apr 04 Javascript
vue 如何使用递归组件
Oct 23 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/10/24 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
javascript适合移动端的日期时间拾取器
2015/11/10 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
vue cli安装使用less的教程详解
2019/07/12 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
Python实现的字典值比较功能示例
2018/01/08 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
使用python进行拆分大文件的方法
2018/12/10 Python
Pandas时间序列基础详解(转换,索引,切片)
2020/02/26 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
卫校中专生个人自我评价
2013/09/19 职场文书
创建文明学校实施方案
2014/03/11 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
养牛场项目建议书
2014/05/13 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL