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 操作select标签实现代码
May 14 Javascript
jQuery阻止冒泡和HTML默认操作
Nov 17 Javascript
XMLHTTPRequest的属性和方法简介
Nov 23 Javascript
判断一个对象是否为jquery对象的方法
Mar 12 Javascript
2种jQuery 实现刮刮卡效果
Feb 01 Javascript
javascript实现带下拉子菜单的导航菜单效果
May 14 Javascript
jQuery基于扩展实现的倒计时效果
May 14 Javascript
Mint UI 基于 Vue.js 移动端组件库
Nov 07 Javascript
Vue.js递归组件构建树形菜单
Dec 24 Javascript
vue ajax 拦截原理与实现方法示例
Nov 29 Javascript
BootStrap前端框架使用方法详解
Feb 26 Javascript
javascript 设计模式之组合模式原理与应用详解
Apr 08 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 无法载入mysql扩展
2010/03/12 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
深入浅出分析javaScript中this用法
2015/05/09 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
AngularJS实现标签页的两种方式
2016/09/05 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
Python的ORM框架SQLObject入门实例
2014/04/28 Python
python实现爬取图书封面
2018/07/05 Python
python http基本验证方法
2018/12/26 Python
在Pycharm中设置默认自动换行的方法
2019/01/16 Python
python统计中文字符数量的两种方法
2019/01/31 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
企业宣传方案
2014/03/04 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
党支部季度考核意见
2015/06/02 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL