前言
今天瞅json转换的时候感觉很奇怪,为什么json格式的数据可以被eval?
(eval应该是拿来执行js代码的,也就是说,json本身就是js代码?)
于是进行了下面的一些小测试
测试们
1.json格式可以直接创建为对象?
今天瞅json转换的时候,发现php关联数组
转成的json是一个类似这样的形式
{"id":"0","title":"title0","subtitle":"subtitle0","isChecked":"0"}
我在这篇文章里提到过{}
=new Object()
,上面的代码也是被{}
罩住的
而json可以使用eval转为一个js关联数组对象,代表着上面的这段代码应该是可以直接被执行的
那么问题来了,上方的这种写法和对象的标准形式
let a = {id:"0",title:"title0", subtitle:"subtitle0", isChecked:"0"}
有啥区别?
实验:
let a = {"id":"0","title":"title0","subtitle":"subtitle0","isChecked":"0"};
alert(a.title); //成功弹窗title0
也就是说,没有区别
那么新的问题出现了,eval的返回值是一个关联数组对象,关联数组的标准访问形式是a["title"]
嗯?a["title"]
=a.title
?
2.关联数组和类是一个东西?
这次我们以纯正的关联数组定义形式创建关联数组
实验:
let a = {};
a["b"] = "c";
alert(a.b); //弹出c
更进一步
let a = {};
a.b = function () {alert("c")}
a["b"](); //同样弹出c
它们真的就是一个东西。。。
要说区别,还是有的,比如以数字开头的东西可以作为关联数组的键值,但是不能以类的形式赋值/访问(这和变量名的要求有关)
3.关联数组和Array有啥关系?
实验:
let a = new Array();
a["b"] = "c";
alert(a.length); //显示0
所以,关联数组和Array没有关系,创建关联数组完全没有必要创建一个Array
对于Array对象来说,以关联数组的形式赋值相当于直接给Array对象增加属性
总结
- 关联数组等于对象
- 关联数组形式赋值相当于直接给对象加属性
- json格式数据确实是可以直接被执行并获得对象的
- js不愧是script