javascript中eval解析JSON字符串


Posted in Javascript onFebruary 27, 2016

我们都知道,高级浏览器可以用  JSON.parse() API 将一个 JSON 字符串解析成 JSON 数据,稍微欠妥点的做法,我们可以用 eval() 函数。

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval('(' + str + ')');
console.log(obj); // Object {name: "hanzichi", age: 10}

是否注意到,向 eval() 传参时,str 变量外裹了一层小括号?为什么要这样做?

我们先来看看 eval 函数的定义以及使用。

eval() 的参数是一个字符串。如果字符串表示了一个表达式,eval() 会对表达式求值。如果参数表示了一个或多个 JavaScript 声明, 那么 eval() 会执行声明。不要调用 eval() 来为算数表达式求值; JavaScript 会自动为算数表达式求值。

简单地说,eval 函数的参数是一个字符串,如果把字符串 “noString” 化处理,那么得到的将是正常的可以运行的 JavaScript 语句。

怎么说?举个栗子,如下代码:

var str = "alert('hello world')";
eval(str);

执行后弹出 “hello world”。我们把 str 变量 “noString” 化,粗暴点的做法就是去掉外面的引号,内部调整(转义等),然后就变成了:

alert('hello world')

very good!这是正常的可以运行的 JavaScript 语句!运行之!

再回到开始的问题,为什么 JSON 字符串要裹上小括号。如果不加,是这个样子的:

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :

恩,报错了。为什么会报错?试试把 str “noString” 化,执行一下:

{"name": "hanzichi", "age": 10}; 
// Uncaught SyntaxError: Unexpected token :

毫无疑问,一个 JSON 对象或者说是一个对象根本就不是能执行的 JavaScript 语句!等等,试试以下代码:

var str = '{name: "hanzichi"}';
var obj = eval(str);
console.log(obj); // hanzichi

这又是什么鬼?但是给 name 加上 “” 又报错?

var str = '{"name": "hanzichi"}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :
console.log(obj);

好吧,快晕了,其实还是可以将 str “nostring” 化,看看是不是能正确执行的 JavaScript 语句。前者的结果是:

{name: "hanzichi"}

这确实是一条合法的 JavaScript 语句。{} 我们不仅能在 if、for 语句等场景使用,甚至可以在任何时候,因为 ES6 之前 JavaScript 只有块级作用域,所以对于作用域什么的并不会有什么冲突。去掉 {} 后 name: "hanzichi"也是合法的语句,一个 label 语句,label 语句在跳出嵌套的循环中非常好用,具体可以参考 label,而作为 label 语句的标记,name 是不能带引号的,标记能放在 JavaScript 代码的任何位置,用不到也没关系。

一旦一个对象有了两个 key,比如 {name: "hanzichi", age: 10} ,ok,两个 label 语句?将 “hanzhichi” 以及 10 分别看做是语句,但是 语句之间只能用封号连接!(表达式之间才能用逗号)。所以改成下面这样也是没有问题的:

var str = '{name: "hanzichi"; age: 10}';
var obj = eval(str); 
console.log(obj); // 10

越扯越远,文章开头代码的错误的原因是找到了,为什么套个括号就能解决呢?简单来说,() 会把语句转换成表达式,称为语句表达式。括号里的代码都会被转换为表达式求值并且返回,对象字面量必须作为表达式而存在。

本文并不会大谈表达式,值得记住的一点是,表达式永远有一个返回值。大部分表达式会包裹在() 内,小括号内不能为空,如果有多个表达式,用逗号隔开,也就是所谓的逗号表达式,会返回最后一个的值。

Javascript 相关文章推荐
jquery中prop()方法和attr()方法的区别浅析
Sep 06 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
Oct 28 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
Dec 11 Javascript
jQuery子属性过滤选择器用法分析
Feb 10 Javascript
jQuery简单实现遍历数组的方法
Apr 14 Javascript
超级给力的JavaScript的React框架入门教程
Jul 02 Javascript
详解JavaScript操作HTML DOM的基本方式
Oct 21 Javascript
jquery.validate 自定义验证方法及validate相关参数
Jan 18 Javascript
详解VueJs前后端分离跨域问题
May 24 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
Jul 10 Javascript
js实现树形数据转成扁平数据的方法示例
Feb 27 Javascript
JavaScript读取本地文件常用方法流程解析
Oct 12 Javascript
javascript先序遍历DOM树的方法
Feb 27 #Javascript
JavaScript开发者必备的10个Sublime Text插件
Feb 27 #Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
Feb 27 #Javascript
JS原型、原型链深入理解
Feb 27 #Javascript
Javascript中Date类型和Math类型详解
Feb 27 #Javascript
原生javascript实现匀速运动动画效果
Feb 26 #Javascript
探索angularjs+requirejs全面实现按需加载的套路
Feb 26 #Javascript
You might like
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
Jquery 设置标题的自动翻转
2009/10/03 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
django实现分页的方法
2015/05/26 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
Python Cookie 读取和保存方法
2018/12/28 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
小学新教师培训方案
2014/02/03 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
主持人演讲稿
2014/05/13 职场文书
安全生产标语口号
2015/12/26 职场文书
Python面向对象之成员相关知识总结
2021/06/24 Python
Android 中的类文件和类加载器详情
2022/06/05 Java/Android