前言

今天瞅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