JavaScript中eval()和$.parseJSON()的区别和联系以及JSON.stringify()的区别
JavaScript中eval()和$.parseJSON()的区别和联系以及JSON.stringify()的区别
一、第一个区别是:安全性
json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢?JSON.parse()之可以解析json格式的数据,并且会对要解析的字符串进行格式检查,如果格式不正确则不进行解析,而eval()则可以解析任何字符串,eval是不安全的
var str = 'alert(1000.toString())';
eval(str);
JSON.parse(str);
用eval可以解析,并且会弹出对话框,而用JSON.parse()则解析不了。 其实alert并没有什么坏处,可怕的是如果用恶意用户在json字符串中注入了向页面插入木马链接的脚本,用eval也是可以操作的,而用JSON.parse()则不必担心这个问题。
注意:某些低级的浏览器尚不支持JSON.parse() 《高性能Javascript》一书即指出:警告:关于JSON和eval需要注意的是:在代码中使用eval是很危险的,特别是用它执行第三方的JSON数据(其中可能包含恶意代码)时,尽可能使用JSON.parse()方法解析字符串本身。该方法可以捕捉JSON中的语法错误,并允许你传入一个函数,用来过滤或转换解析结果。如果此方法以备Firfox 3.5 、IE8 及 Safari 4 原生支持。大多数javascript类库包含的JSON解析代码会直接调用原生版本,如果没有原生支持的话,会调用一个略微不那么强大的非原生版本来处理。
二、 第二个区别:JSON.parse()解析的必须是json格式的字符串要不报错,而eval()则没有这么严格
在这里“json格式的字符串”是指要求指定的字符串必须符合严格的JSON格式,例如:属性名称必须加双引号、字符串值也必须用双引号。
如果传入一个格式不"完好"的JSON字符串将抛出一个JS异常 json的解析方法共有两种:eval 和 JSON.parse(),如:
var jsonStr= '{"name":"lulu", "sex":"female"}';
var evalJson=eval('('+jsonStr+')');
var jsonParseJson=JSON.parse(jsonStr);
这样就把json格式的字符串jsonStr转换成了JSON对象。
但是区别是:
var age = 27;
var jsonStr= '{"name":"lulu", "sex":"female","age":++age}';
var evalJson=eval('('+jsonStr+')'); //不报错此时age的值是28
var jsonParseJson=JSON.parse(jsonStr);//报错
从上面eval()函数的用法我们可以看出eval()函数在解析json格式的字符串时要加上圆括号如eval(’(’+jsonStr+’)’),这是因为:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。
三、JSON.stringify()
JSON.stringify()是把json数据转化成json格式的字符串如:
var jsonObj = {"name":"lulu","sex":"female"};
var jsonStr = JSON.stringify(jsonObj);
JavaScript中eval()和$.parseJSON()的区别和联系以及JSON.stringify()的区别相关推荐
- 【javaScript】JavaScript中一个等号、二个等号、 三个等号 的区别(详细例子)
一.单等于号 1.单等于号具有赋值作用 我们在定义变量时,会对变量进行赋值,例如a=1,就是把1赋值给a. 这就是在初始化对象的时候进行赋值. 2.单等于号具有引用对象作用 比如我们写了 var a ...
- JSON.parse()和JSON.stringify()的区别
一.JSON.parse()用于从一个字符串中解析出json对象. 举例: var str = '{"name":"test","age": ...
- php 中eval 和javascript中eval有什么区别,DataBinder.Eval与Eval区别分析
在asp.net编程中,缩短的Eval语法与DataBinder.Eval的不同点在于: Eval会根据最近的容器对象(例如DataListItem)的DataItem属性来自动地解析字段,而Data ...
- javascript中while循环、do....while与for循环的用法和区别
while语法: 1.while语法: while(循环条件){ 循环主体; } 计算表达式的值,当值为真(非0)时,则 执行循环体语句. 例: <script type="text/ ...
- JavaScript中eval()函数
eval调用时,实例为eval( "( javascript代码 )" ), eval() 函数可将字符串转换为代码执行,并返回一个或多个值. 转载于:https://www.cn ...
- JavaScript中eval方法的替代方法
公司开设新的考核标准,着重对代码质量进行考核,用到的代码实时检测工具是sonaLint.用SonarLint进行代码检测的时候,会 出现对显示审查结果严重提示 Review the arguments ...
- JavaScript中一个等号、二个等号、 三个等号 的区别
一个等号是赋值操作,==先转换类型再比较,===先判断类型,如果不是同一类型直接为false. === 判断规则 如果类型不同,就[不相等] 如果两个都是数值,并且是同一个值,那么[相等]:(!例外 ...
- Post请求中加不加@RequestBody的区别和formedata与JSON传递的区别
package com.atguigu.boot.controller;import org.springframework.web.bind.annotation.PostMapping; impo ...
- JSON.parse()与JSON.stringify()的区别
优质参考资料:https://www.cnblogs.com/goatling/p/6293692.html 转载于:https://www.cnblogs.com/wang-min/p/104458 ...
最新文章
- 在Mac上使用pip3安装python的数据统计模块实录
- python函数注释 参数 省略号_python – make函数在help()函数中有参数的省略号
- 三大技术突破,网易云信实现在线音乐教育极速上线
- k8s Service之LoadBalancer和ExternalName
- 前端学习(3124):react-hello-react之props的简写
- 赛尔原创 | N-LTP:基于预训练模型的中文自然语言处理平台
- 【linux】Linux配置环境变量
- Supervisord管理
- 公司来的新同事能力没我强,但是工资比我高,我应该提出加薪还是选择辞职?
- Beetl 性能揭秘 1 :如何输出一个整型变量
- Prometheus监控(二)
- 单元格自适应宽度_Excel – 合并单元格时,如何同时保留每个单元格的内容?...
- 中标麒麟的下载和安装
- jane street market prediction 冠军方案 经验分享 (1/3)
- python导入自定义模块_python引入不同文件夹下的自定义模块方法
- 我的CSDN之旅:2020年终总结
- shell小数点前不打0_shell十三问:关于${0##*/} 和${0%/*}
- 虹科方案 | 虹科基于空口测试的新型5G毫米波测试方案
- matlab勾股定理,勾股定理的两个物理证明
- 要学计算机买macbook,我是学平面设计的,买苹果电脑需要什么样的配置以上?...