json中的转义符以及eval函数和JSON.parse函数的对比

这篇文章(从一个 JSON.parse 错误深入研究 JavaScript 的转义字符) 可以参考一下,但是该篇文章好像也没讲的太清楚

json中的转义符以及eval()函数和JSON.parse()函数的对比

直接po截图和代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>json中的转义符以及eval()函数和JSON.parse()函数的对比</title>
<script type="text/javascript">
/*
如下这2个网页中,讲到了json中转义字符\的问题,大家可以参考一下
参考网页http://www.360doc.com/content/13/0723/14/13247663_301951524.shtml
参考网页https://www.cnblogs.com/cmblogs/p/6022195.html

eval()函数在解析json字符串时,会执行该字符串中的js代码(这存在安全隐患,这样的后果是相当恶劣的)

参考网页https://www.runoob.com/jsref/jsref-eval.html
eval()函数在解析字符串时,会执行该字符串中的代码,所以有安全隐患(这样的后果是相当恶劣的)

eval()函数会执行js代码语句或表达式

eval在解析字符串时,会执行该字符串中的代码(这样的后果是相当恶劣的)
eval方法不会去检查给的字符串是否符合json的格式,
同时如果给的字符串中存在js代码eval也会一并执行

JSON.parse()函数对json字符串的格式要求更严格

eval()函数对json格式的字符串的要求没有那么严格,如果json格式的字符串中包含js代码,那么该js代码会执行

JSON.parse()函数对json格式的字符串的要求比较严格,会检测json格式的字符串是否合法,格
式是否正确,是否包含js语句,如果包含js语句,就会认为这是非法的json

JSON.parse()函数对json字符串的格式要求严格

eval()函数对json字符串的格式要求没那么严格,json字符串中如果包含js语句代码,则该js代码会执行(即eval()函数会执行js代码语句或表达式)
 
JSON.parse()函数对json格式的字符串的要求比较严格,会检测json格式的字符串是否合法,格式是否正确,是否包含js语句,如果包
 含js语句,就会认为这是非法的json

*/

//--------------------------
/*
json字符串中使用转义字符(参考网页https://www.cnblogs.com/cmblogs/p/6022195.html)
转义符对JSON.parse()函数和对eval()函数的影响
json中转义字符的影响(参考网页http://www.360doc.com/content/13/0723/14/13247663_301951524.shtml)
*/
var p6 = '{"name": "\\"黄蓉\\\\", "age": console.log("中国\\"es\\\\yes")}';
//变量p6是一个json格式的字符串,变量p6被eval()函数解析后会变成一个json格式的对象

/*
变量p6被eval()函数解析后,最终会变
成{"name": "\"黄蓉\\", "age": console.log("中国\"es\\yes")}这样的一个json格式的对象
*/
var v7 = eval("(" + p6 + ")"); //正确 (打印出的结果为中国"es\yes)
console.log(v7.name);//打印出的结果为"黄蓉\
// var v8 = JSON.parse(p6); //报错


//--------------------------
var pw = '{"name": "\\\"郭靖\\\\", "age": console.log("于都县\\\"es\\\\yes")}';
//变量pw是一个json格式的字符串,变量pw被eval()函数解析后会变成一个json格式的对象
/*
变量pw被eval()函数解析后,最终会变
成{"name": "\"郭靖\\", "age": console.log("于都县\"es\\yes")}这样的一个json格式的对象
*/
var v66 = eval("(" + pw + ")"); //正确 (打印出的结果为于都县"es\yes)
console.log(v66.name);//打印出的结果为"郭靖\



//--------------------------
//定义一个变量(该变量是对象类型)
var pm = {"name": "\"杨康\\", "age": console.log("中国\"es\\yes")};
console.log(pm.name);
//pm.age;
console.log("**********************");


//--------------------------
var bb = {"name": "\\韦小宝曾柔\\\\", "age": console.log("ha\\haha\\\\haha")};
console.log(bb.name);
bb.age;

//--------------------------
console.log('t\\y"ui\op');
console.log("he\"\"ll'o");
var t1 = '"a"b\"\"cd\'e\'f';
console.log(t1);

//--------------------------
//以下定义的变量都是字符串
var nn = '{"name":"东方不败", "info":console.log(\'天若有情天亦老!!!\')}';
//eval()函数对json格式的字符串的要求没有那么严格,如果json格式的字符串中包含js代码,那么该js代码会执行
var nnObj = eval('(' + nn + ')'); //正确
//JSON.parse()函数对json格式的字符串的要求比较严格,会检测json格式的字符串是否合法,格式是否正确,是否包含js语句,包含js语句,就可能会认为是非法的
// var nnObj2 = JSON.parse(nn); //报错(nn变量的值中包含js语句,parse()函数会检测到这是非法的,所以会报错)
var mm = '{"name": "岳不群", "age": console.log("辟邪剑谱")}';
var mmObj = eval('(' + mm + ')'); //正确
// var mmObj2 = JSON.parse(mm); //报错

//把age属性的值设置成一个字符串
var yy = '{"name": "左冷禅", "age": "console.log(\'葵花宝典\')"}';
var yyObj = eval('(' + yy + ')'); //正确
console.log(yyObj.name + "-" + yyObj.age);
var yyObj2 = JSON.parse(yy); //正确
console.log(yyObj2.name + "-" + yyObj2.age);

//--------------------------
/*
转义符对JSON.parse()函数的影响
json中使用转义符(参考网页http://www.360doc.com/content/13/0723/14/13247663_301951524.shtml)
参考网页https://www.cnblogs.com/cmblogs/p/6022195.html
*/
var json_obj2 = {a : '<div class=\"img-brk\"/><div class=\"img-brk\"'};
console.log(json_obj2.a); //结果为<div class="img-brk"/><div class="img-brk"
//'单引号中的"双引号加不加\斜杠转义都可以,以下语句跟上一句的结果一样
var json_obj3 = {age : '<div class="img-brk"/><div class="img-brk"'};
console.log(json_obj3.age);//结果为<div class="img-brk"/><div class="img-brk"

</script>
</head>
<body>
<h2>json中的转义符以及eval()函数和JSON.parse()函数的对比</h2>
</body>
</html>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值