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 相关文章推荐
EXT中xtype的含义分析
Jan 07 Javascript
js word表格动态添加代码
Jun 07 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
Nov 28 Javascript
stream.js 一个很小、完全独立的Javascript类库
Oct 28 Javascript
jquery移动点击的项目到列表最顶端的方法
Jun 24 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
Jan 04 Javascript
探究Vue.js 2.0新增的虚拟DOM
Oct 20 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
Dec 24 Javascript
vue登录注册及token验证实现代码
Dec 14 Javascript
js console.log打印对象时属性缺失的解决方法
May 23 Javascript
layui 实现自动选择radio单选框(checked)的方法
Sep 03 Javascript
vue实现简单瀑布流布局
May 28 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
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
JQuery中getJSON的使用方法
2010/12/13 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
python字符类型的一些方法小结
2016/05/16 Python
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
python Web开发你要理解的WSGI & uwsgi详解
2018/08/01 Python
简单了解django文件下载方式
2020/02/10 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
厨师长岗位职责范本
2014/08/25 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
2015民办小学年度工作总结
2015/05/26 职场文书
高中英语教学反思范文
2016/03/02 职场文书
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python
springboot集成flyway自动创表的详细配置
2021/06/26 Java/Android
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android
python字典进行运算原理及实例分享
2021/08/02 Python
js 数组 fill() 填充方法
2021/11/02 Javascript
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers