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 04 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
Jan 30 Javascript
Javascript获取当前时间函数和时间操作小结
Oct 01 Javascript
transport.js和jquery冲突问题的解决方法
Feb 10 Javascript
10个很棒的jQuery代码片段
Sep 24 Javascript
Bootstrap布局之栅格系统详解
Jun 13 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 Javascript
浅析location.href跨窗口调用函数
Nov 22 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
Mar 09 Javascript
12个非常有用的JavaScript技巧
May 17 Javascript
JavaScript日期工具类DateUtils定义与用法示例
Sep 03 Javascript
React降级配置及Ant Design配置详解
Dec 27 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 咖啡文化
Zend的MVC机制使用分析(一)
2013/05/02 PHP
用PHP实现弹出消息提示框的两种方法
2013/12/17 PHP
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
python 阶乘累加和的实例
2019/02/01 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
python调用支付宝支付接口流程
2019/08/15 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
一个入门级python爬虫教程详解
2021/01/27 Python
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
数控专业大学生的自我鉴定
2013/11/13 职场文书
医学检验专业大学生求职信
2013/11/18 职场文书
高一学生期末评语
2014/04/25 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python
Python实现打乒乓小游戏
2021/09/25 Python
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python