javascript中eval函数和JSON.parse函数的区别和比较

直接po代码和截图

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javascript中eval()函数和JSON.parse()函数的区别和比较</title>
<script type="text/javascript">

/*

JSON标准格式可以参考网页https://blog.csdn.net/assholeu/article/details/43037373

标准JSON写法如下
JSON.parse()函数对json串的格式要求比较严格,eval()函数对json串的格式要求没有那么严格
以下是最标准,最规范的json格式字符串的写法,JSON.parse()函数和eval()函数都可以正确解析以下json
var jsonStr = '{"userName":"令狐冲", "age":"19", "address":"江西省赣州市于都县"}';
或者你格式化一下代码,就像如下:
var jsonStr = '{
		"userName" : "令狐冲",
		"age" : "19",
		"address" : "江西省赣州市于都县"
	}';
	
参考文章https://www.cnblogs.com/jun-tao/p/3707663.html	
*/

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

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

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

var a = 'var x = 66; var y = 88; console.log("x=" + x + " y=" + y + " x+y=" + (x+y));';
eval(a);
window.eval(a);
//
var b = 99;
eval('console.log("b=" + b);');
window.eval('console.log("b=" + b);');
eval('console.log(5+6*10);');
window.eval('console.log(5+6*10);');
eval("x=10;y=20;console.log(x*y);");
window.eval("x=10;y=20;console.log(x*y);");
eval("console.log('江西省赣州市于都县');");
window.eval("console.log('江西省赣州市于都县');");

/*
疑问?大家思考一下,window.eval()和eval()这2者有什么区别? 
这个问题我暂时还不太清楚,等有时间再去深究,大家有兴趣的可以上网查一下资料。
参考网页http://www.imooc.com/article/26358
参考网页https://blog.csdn.net/superdog007/article/details/23943649
*/

console.log(eval(666));//正确
console.log(eval(88.99));//正确
console.log(eval(true));//正确
console.log(eval(false));//正确
console.log(eval('({})'));//正确
//注意:使用eval来解析JSON格式字符串的时候,会将{}解析为代码块,而不是对象的字面量
//把JSON格式的字符串使用()小括号括起来,此时就不会将()小括号解析为代码块,而是表达式
console.log(eval('({"age":"16","address":"china江西省赣州市于都县"})'));//正确
// console.log(eval('{"age":"15","address":"china江西省赣州市于都县"}'));//报错
// console.log(eval('()'));//报错
// console.log(eval('China江西省赣州市于都县渡江大道66666号'));//报错
console.log(eval(null));//正确
console.log(eval('({})'));//正确
// eval('alert("I Love China....")');//正确

eval("var myMoney = 26");//声明一个变量myMoney并赋值26
console.log('变量myMoney=' + myMoney);
eval("var myAddress = 'China的江西省于都县';");//声明一个变量myAddress并赋值China的江西省于都县
console.log('变量myAddress=' + myAddress);
console.log('返回结果为' + eval("2 + 3 * 10"));//执行加运算,并返回运算值

function testFun2(){
	return '乘风破浪会有时!!!!';
}

var returnResult = eval("testFun2()");//执行testFun2()函数
console.log("函数的返回结果是" + returnResult);

//注意:使用eval来解析JSON格式字符串的时候,会将{}解析为代码块,而不是对象的字面量
//把JSON格式的字符串使用()小括号括起来,此时就不会将()小括号解析为代码块,而是表达式
//声明一个对象,如果想返回此对象,则需要在对象外面再嵌套一层小括如下:eval("({myAge:'16',myhobby:'跑步'})");
// var result6 = eval("{myAge:'16',myhobby:'跑步'}");//报错
var result7 = eval("({myAge:'16',myhobby:'跑步'})");//正确
console.log(result7, result7.myAge, result7.myhobby);

eval("var myV2 = {myAge:'12',myhobby:'走路'}");//正确
// eval("(var myV3 = {myAge:'13',myhobby:'散步'})");//报错
eval("var myV4 = ({myAge:'14',myhobby:'哈哈哈'})");//正确
eval("var myV5 = " + "{myAge:'15',myhobby:'跑跑跑'}");//正确
// eval("(var myV6 = " + "{myAge:'16',myhobby:'走走走'})");//报错
eval("var myV7 = " + "({myAge:'17',myhobby:'嘻嘻嘻'})");//正确
console.log(myV2, myV4, myV5, myV7);

//eval()函数中的字符串后面带;分号(即js语句后面带;分号)
eval("var myV8 = {myAge:'18',myhobby:'走路带风'};");//正确
// eval("(var myV9 = {myAge:'19',myhobby:'散步带风'});");//报错
eval("var myV10 = ({myAge:'20',myhobby:'哈哈哈带风'});");//正确
eval("var myV11 = " + "{myAge:'21',myhobby:'跑跑跑带风'};");//正确
// eval("(var myV12 = " + "{myAge:'22',myhobby:'走走走带风'});");//报错
eval("var myV13 = " + "({myAge:'23',myhobby:'嘻嘻嘻带风'});");//正确
console.log(myV8, myV10, myV11, myV13);


var jsonStr12 = "{'fullName':'赵敏郡主', 'age':'19', 'address':'江西省赣州市于都县'}";
var jsonStr13 = '{"fullName":"小李飞刀李寻欢", "age":"18", "address":"中国江西省赣州市于都县"}';

var obj100 = eval("(" + jsonStr12 + ")");//正确
console.log(obj100.fullName, obj100.age, obj100.address);
// var obj101 = JSON.parse(jsonStr12);//报错

var obj120 = eval("(" + jsonStr13 + ")");//正确
console.log(obj120.fullName, obj120.age, obj120.address);

var obj126 = JSON.parse(jsonStr13);//正确
console.log(obj126.fullName, obj126.age, obj126.address);


/*
JSON.parse()函数对json格式的字符串的要求比较严格,会检测json格式的字符串是否合法,格式是否正确,是否包含js语句,如果包
 含js语句,就会认为这是非法的json
*/
// JSON.parse('console.log("江西省赣州市于都县");'); //报错

//定义一个变量(该变量是一个对象)
var Person = {
name: '令狐冲',
age: '18',
address: '华山派',
showme: function(){
          console.log('我是' + this.name);
        }
};

console.log(Person.name);
Person.showme();

//定义一个变量(该变量是一个json格式的字符串)
var person2 = "{email: '韦小宝',age: '17',address: '紫禁城',showme: function(){console.log(this + '我是' + this.email);}}";
//花括号里的js语句不加分号也不会报错
var person2 = "{email: '韦爵爷',age: '18',address: '紫禁城',showme: function(){console.log(this + '我是' + this.email)}}";
// var jsonObj = eval(person2); //报错
var jsonObj = eval("(" + person2 + ")"); //正确,记得要在两边加小括号
console.log(jsonObj.email);
jsonObj.showme(); //this是指的对象本身,并且可以拿到email的值

/*
JSON.parse()函数对json格式的字符串的要求比较严格,会检测json格式的字符串是否合法,格式是否正确,是否包含js语句,如果包
 含js语句,就会认为这是非法的json
*/
// var obj = JSON.parse(person2);//报错
// console.log(obj);

//以下的p变量,用eval()函数解析后,执行p变量中的匿名函数时会报错uName is not defined
var p = '{"uName": "杨过","age": "16","address": "古墓","showme": function(){console.log(this + "我是" + uName);}}';
//以下的p变量,用eval()函数解析后,执行p变量中的匿名函数时不会报错,因为p变量中用的是this.uName
var p = '{"uName": "杨大侠","age": "16","address": "古墓","showme": function(){console.log(this + "我是" + this.uName);}}';

/*
JSON.parse()函数对json格式的字符串的要求比较严格,会检测json格式的字符串是否合法,格式是否正确,是否包含js语句,如果包
 含js语句,就会认为这是非法的json
*/
// var obj2 = JSON.parse(p); //报错
// console.log(obj2);

var v1 = eval("(" + p + ")"); //正确
console.log("---**---" + v1.uName);
v1.showme(); //this是指的对象本身,并且可以拿到uName的值

//testJsonObj变量中的函数会立即执行,此时会报错myName is not defined
// var testJsonObj = {"myName": "风清扬", "showme": (function(){console.log("===" + this + "===" + myName);})()};

//testJsonObj变量中的函数会立即执行,此时会打印出***[object Window]===undefined
//testJsonObj变量中的函数会立即执行,此时this指的是window对象
var testJsonObj = {"myName": "李寻欢", "showme": (function(){console.log("***" + this + "===" + this.myName);})()};
//testJsonObj变量中的函数会立即执行,此时this指的是window对象
var testJsonObj = {"myName": "朱元璋", "showme": (function(){console.log("###*****" + this);})()};
//testJsonObj变量中的函数不会立即执行,需要手动调用才会执行
var testJsonObj = {"myName": "周芷若", "showme": function(){console.log("*-*" + this + "-" +this.myName);}};
//手动调用才会执行函数,此时函数中的this指的是对象本身,myName也可以拿到值,拿到的值是周芷若
testJsonObj.showme();
//如果testJsonObj变量中的函数中的this.myName直接写成myName,那么在执行函数时会报错myName is not defined
var testJsonObj = {"myName": "周芷若", "showme": function(){console.log("*-*" + this + "-" + myName);}};
//在执行函数时会报错myName is not defined
// testJsonObj.showme();




var p2 = '{"name": "乔峰","age": "32","address": "丐帮","showme": "hello"}';
var obj3 = JSON.parse(p2); //正确
console.log(obj3);
console.log(obj3.name + "-" + obj3.age + "-" + obj3.address + "-" + obj3.showme);

var v2 = eval("(" + p2 + ")"); //正确
console.log("------" + v2.name);


//故意把key键的双引号去掉了,测试一下用JSON.parse()函数来解析,看是否会报错
var p3 = '{"name": "段誉", "age": "24", address: "大理", "showme": "hi"}';
/*
JSON.parse()函数对json格式的字符串的要求比较严格,会检测json格式的字符串是否合法,格式是否正确,是否包含js语句,如果包
 含js语句,就会认为这是非法的json
*/
// var obj4 = JSON.parse(p3); //报错
// console.log(obj4);

var v3 = eval("(" + p3 + ")"); //正确
console.log("------" + v3.name);

//把key键的双引号加回去
var ppp = '{"name": "王语嫣", "age": "24", "address": "慕容复表妹", "showme": "hi"}';
//这样就不会报错了
var obj44 = JSON.parse(ppp); 
console.log(obj44.name, obj44);


//
var person3 = "{name: '张无忌',age: '21',address: '光明顶',showme: function(){console.log('我是' + this.name);}}";
var jsonObj2 = eval('(' + person3 + ')'); //正确,记得要在两边加小括号
console.log(jsonObj2.name);

//
var person4 = "({name: '郭靖',age: '23',address: '光明顶',showme: function(){console.log('我是' + this.name);}})";
var jsonObj3 = eval(person4); //正确,两边不用加小括号,因为给person4变量赋值的时候,两边已经加了小括号了
console.log(jsonObj3.name);
jsonObj3.showme();


var p4 = '{"name": "虚竹", "age": console.log("okok")}';
var v4 = eval("(" + p4 + ")"); //正确
/*
JSON.parse()函数对json格式的字符串的要求比较严格,会检测json格式的字符串是否合法,格式是否正确,是否包含js语句,如果包
 含js语句,就会认为这是非法的json
*/
// var v5 = JSON.parse(p4); //报错

var aa = 'console.log("----------------gogo")';
var p5 = '{"name": "小龙女", "age":' + aa + '}';
var v5 = eval("(" + p5 + ")"); //正确
/*
JSON.parse()函数对json格式的字符串的要求比较严格,会检测json格式的字符串是否合法,格式是否正确,是否包含js语句,如果包
 含js语句,就会认为这是非法的json
*/
// var v6 = JSON.parse(p5); //报错


//参考网页https://www.runoob.com/json/json-parse.html
var text = '{ "name":"任盈盈", "initDate":"2019-09-15", "site":"https://blog.csdn.net/czh500"}';
//JSON.parse()函数的第二个参数
//我们可以启用 JSON.parse 的第二个参数 reviver,一个转换结果的函数,对象的每个成员调用此函数
var v9 = JSON.parse(text, function(key, value) {
	if (key == "initDate") {
// 		return new Date(value);
// 		return (new Date()).getFullYear();
// 		return new Date().getFullYear();
		return formatDate(new Date().getTime());
	} else {
		return value;
	}
});

console.log(v9.name + "-" + v9.initDate + "-" + v9.site);

//不建议在JSON中使用函数
//参考网页https://www.runoob.com/json/json-parse.html
//JSON不允许包含函数,但你可以将函数作为字符串存储,之后再将字符串转换为函数
var text2 = '{ "name":"建宁公主", "alexa":"function () {return 666;}", "site":"https://blog.csdn.net/czh500"}';
var v10 = JSON.parse(text2); //正确
v10.alexa = eval("(" + v10.alexa + ")");
console.log(v10.name + " Alexa排名:" + v10.alexa());

/*
参考网页 https://www.cnblogs.com/eason1999/p/5527413.html
*/
//
var value = 15;
var jsonstr = '{"data1":"hello","data2":++value}';
//eval在解析字符串时,会执行该字符串中的代码(这样的后果是相当恶劣的)
var d1 = eval('('+jsonstr+')');
console.log(d1);
//这时value值为16
console.log(d1.data2);
//eval解析一个json字符串而造成原先的value的值改变
console.log(value);

//json字符串中包含了js语句代码,所以JSON.parse()函数在解析该json字符串时会报错
//jsonstr变量中包含了js语句代码,对于JSON.parse()函数来说,jsonstr变量是个格式不正确的,非法的json字符串

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

// var d2=JSON.parse(jsonstr); //报错


/*
 《高性能Javascript》一书即指出:
警告:关于JSON和eval需要注意的是:在代码中使用eval是很危险的,特别是用它执行第三方的JSON数据(其中可
能包含恶意代码)时,尽可能使用JSON.parse()方法解析字符串本身。该方法可以捕捉JSON中的语法错误,并允
许你传入一个函数,用来过滤或转换解析结果。如果此方法以备Firfox 3.5 、IE8 及 Safari 4 原生支持。大
多数javascript类库包含的JSON解析代码会直接调用原生版本,如果没有原生支持的话,会调
用一个略微不那么强大的非原生版本来处理。
*/

/*
 eval在解析字符串时,会执行该字符串中的代码(这样的后果是相当恶劣的)
 eval方法不会去检查给的字符串是否符合json的格式,
 同时如果给的字符串中存在js代码eval也会一并执行
 
 JSON.parse()函数对json字符串的格式要求更严格
 
 
*/

//以下定义的变量都是对象
//自动执行打印语句
var cc = {"name":"欧阳峰", "info":console.log('一万年太久只争朝夕')}; 
//不会自动执行打印语句
var dd = {"name":"洪七公", "info":function () {console.log('哈哈哈');}};
var ee = {"name":"袁承志", "info":function () {console.log('哦哦哦')}}; //花括号里的js语句不加分号也不会报错
//自动执行打印语句
var ff = {"name":"王重阳", "info":(function () {console.log('呵呵呵呵呵呵');})()};
var gg = {"name":"周伯通", "info":(function () {console.log('嗯嗯嗯嗯嗯嗯')})()}; //花括号里的js语句不加分号也不会报错
//自动执行打印语句
var hh = {"name":"陈家洛", "info":(function () {console.log('嘻嘻嘻');}())};
var jj = {"name":"任我行", "info":(function () {console.log('吼吼吼')}())}; //花括号里的js语句不加分号也不会报错


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

//(nn变量的值中包含js语句,parse()函数会检测到这是非法的,所以会报错)
// var nnObj2 = JSON.parse(nn); //报错

var mm = '{"name": "岳不群", "age": console.log("辟邪剑谱")}';
var mmObj = eval('(' + mm + ')'); //正确
//(mm变量的值中包含js语句,parse()函数会检测到这是非法的,所以会报错)
// var mmObj2 = JSON.parse(mm); //报错

//JSON字符串中最好不要包含js代码语句,但你可以将js代码语句作为字符串存储
//把age属性的值设置成一个字符串(此时,age属性的值仅仅是一个字符串而已,而不是js语句代码)
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);
	
//定义时间格式化函数
//参考网页https://blog.csdn.net/qq_42402854/article/details/87856382
function formatDate(time){
    var date = new Date(time);
    var year = date.getFullYear(),
        month = date.getMonth() + 1,//月份是从0开始的
        day = date.getDate(),
        hour = date.getHours(),
        min = date.getMinutes(),
        sec = date.getSeconds();
    var newTime = year + '-' +
        month + '-' +
        day + ' ' +
        hour + ':' +
        min + ':' +
        sec;
    return newTime;
};

//-------------------
//立即执行函数(第1种写法)
(function(){
	//立即执行函数中的this指的是window对象
	console.log("立即执行函数中的this=" + this);
	console.log(this.aaa); //结果是undefined
	console.log(this.bbb); //结果是undefined
})();

//立即执行函数(第2种写法)
(function(){
	//立即执行函数中的this指的是window对象
	console.log("立即执行函数中的this是" + this);
	console.log(this.yyy); //结果是undefined
	console.log(this.zzz); //结果是undefined
}());

//没有名字的函数就叫做匿名函数
var fun1 = function(){
	console.log('哈哈哈,我是匿名函数');
};
//
fun1(); //正确(可以正确执行函数)
(fun1()); //正确(可以正确执行函数)

var f = fun1;
f(); //正确(可以正确执行函数)

//
var fun2 = function(){
	console.log('大家好我是匿名函数');
}();

//this和window对象
var my_hometown = '江西省赣州市于都县';
console.log(my_hometown); //结果为江西省赣州市于都县
console.log(window.my_hometown); //结果为江西省赣州市于都县
console.log(this); //this指的是window对象
console.log(this.my_hometown); //结果为江西省赣州市于都县

</script>
</head>
<body>
<h2>javascript中eval()函数和JSON.parse()函数的区别和比较</h2>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值