内存世界
上图我们可以简单的看作电脑内存,我们的JS代码就存放在代码区,变量存放在不知道什么区,而数据则专门存放在Stack(栈区),Heap(堆区)中。
- stack与heap的区别
- stack存放对象(string number booleans),顺序存放
- heap存放非对象,随机存放
对象的篡改
var person = {name : "jack"};
var person2 = person;
person2.name = "ryan"
console.log(person.name)
此时,person的name也被篡改为ryan。
我们可以看到,person和person2其实指向的是同一个地址,所以,无论变更哪一个变量,另一个变量的数据都会随之改变。
window
我们常用的全局变量通常都是挂在window下面的,例如:Object,Arrary,console,document,Function。
通过上面的对象篡改,我们也可以将变量进行篡改(全局变量不可被篡改)
原型链
从上图中,我们可以看到window下分别有多个全局变量,例如Object,Arrary,
他们分别指向了另一个地址,
那个地址中的prototype又分别指向另一个地址。
当我们使用obj或arr时,会通过__proto__ 指向各自的Prototype对应的地址,调用其中的内容。故称为原型链。
__proto__的作用就在于将其与Prototype隔离开来,使其无法被篡改。