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 相关文章推荐
网页设计常用的一些技巧
Dec 22 Javascript
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
Aug 21 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
JavaScript中的style.display属性操作
Mar 27 Javascript
浅谈javascript六种数据类型以及特殊注意点
Dec 20 Javascript
浅析Node.js中的内存泄漏问题
Jun 23 Javascript
js学习阶段总结(必看篇)
Jun 16 Javascript
Vue.js组件tab实现选项卡切换
Mar 23 Javascript
vue拦截器Vue.http.interceptors.push使用详解
Apr 22 Javascript
Vue ElementUI之Form表单验证遇到的问题
Aug 21 Javascript
p5.js临摹动态图形的方法
Oct 23 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
Oct 29 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
免费空间广告万能消除代码
2006/09/04 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
javascript测试题练习代码
2012/10/10 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
Vue组件开发初探
2017/02/14 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2019/04/08 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
python模糊图片过滤的方法
2018/12/14 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
CSS3属性选择符介绍
2008/10/17 HTML / CSS
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
如何执行一个shell程序
2012/11/23 面试题
复核员上岗演讲稿
2014/01/05 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
给校长的建议书
2014/03/12 职场文书
培训班主持词
2014/03/28 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
亲情作文之母爱
2019/09/25 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
Django基础CBV装饰器和中间件
2022/03/22 Python
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python