JS内存浅解&原型
JS将JS引擎中的内存区分划分成:
-
代码区:存放代码
-
不知道什么区:存放变量名
-
数据区:存放数据
- Stack区:栈,顺序存储,连续存储
- Heap区:堆,随机存储,链接存储
-
其他区域,在此不深究
Stack与Heap
数据分为:
-
非对象:数值、字符串、布尔,存放在Stack中
-
对象:其他,存放在Heap中
传值与传址:
b=a
=总是会把右边的东西复制到左边
如果a为非对象数据,则Stack区中存放的是a的值,那么=传值
如果a为对象数据,则Stack区中存放的是a对应数据所在Heap区中的地址,那么=传址,会出现篡改对象的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| > var a = "1" < undefined
> a < '1'
> var b = a < undefined
> b < '1'
> a = "2" < '2'
> b < '1'
---------------
> var a = {name: "w"} < undefined
> var b = a < undefined
> a < {name: 'w'}
> b < {name: 'w'}
> b.name = "1" < '1'
> a.name < '1'
|
prototype 与 prototype chain
几乎每个首字母大写的对象都有一个prototype属性,例如Object、Array、Function等。
例如:
Object.prototype中存储了Object对象的共同属性,所有Object对象都可以使用,因为所有的Object对象中都有一个__proto__的隐藏属性,对应着Object.prototype,这就是prototype chain
prototype属性和__proto__属性区别
prototype属性和__proto__属性都只存储了prototype的地址,prototype属性挂靠在每个函数上,__proto__属性挂靠在每个新生成的对象上
tips
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| > var a = {} < undefined
> var b = {} < undefined
> Object.prototype.toString = "1" < '1'
> a.toString < '1'
> b.toString < '1'
> a.toString = "2" < '2'
> b.toString < '1'
> a.__proto__.toString = "3" < '3'
> b.toString < '3'
> Object.prototype.xxx = "111" < '111'
> a.xxx < '111'
> b.__proto__.yyy = "222" < '222'
> a.yyy < '222'
|