JS全解-内存世界

147 阅读2分钟

浏览器的功能:
1、向浏览器发起请求,如地址栏输入baidu.com
2、下载HTML、解析HTML、下载CSS、解析CSS
3、这个过程合起来,显示到屏幕上,称为渲染界面
4、下载JS、解析JS、执行JS

浏览器的页面模块有用户界面、渲染引擎、JS引擎、存储等,前端关注渲染引擎JS引擎

每个页面都会开启一个渲染线程和JS线程,JS是单线程的。如果JS需要去修改HTML或CSS,它不能直接修改,需要通过线程之间的通信来通知渲染引擎,这个过程叫做跨线程通信
(DOM操作慢,因为是跨线程通信)

JS引擎的主要功能是编译代码、优化代码、执行代码、垃圾回收。


内存的数据区,分为stack栈区和heap堆区,它们只存数据,不存变量名。

特点:

  • stack:每个数据顺序存放
  • heap:每个数据随机存放
规律:
  • 非对象数据(数字、字符串、布尔值)都存在stack
  • 对象数据(数组、函数)都存在heap
  • ∵随机存放,如果对象有新增属性,可以随机占内存添加,更高效。

“=”总是把右边东西复制到左边

var p2 = p 相当于把p的地址复制给p2


console.dir 可以查看结构

console.dir(window.Array)
console.dir(window.Object)

window变量 ≠ window对象
window变量是一个容器,存放window对象的地址,window对象是heap里的数据
同理,console属性 ≠ console对象,Object ≠ Object函数对象
前者是内存地址,后者是一坨数据


一层可以篡改,两层以上不能篡改

var a = {name:'jack'}
var b = a
b.name = 'frank'
console.log(a.name) //'frank'
obj = {name:'jack'}
obj2 = {name:'frank'}
obj.toString = 'xxx'
obj2.toString 不会改变

xxx.prototype存储了xxx对象的共有属性——原型
每个对象都有一个隐藏属性,指向原型(对象)

prototype和__proto__的区别:
都存着原型的地址
prototype挂在构造函数上
__proto__挂在每个新生成的对象上

如果尝试篡改共有属性,是改不到的,只能读到共有属性


var a = [1,2,3]
var b = a
b.push = 'xxx'
a.push(4) //报错

这里篡改不会改__proto__里的push,而是直接加对象上的属性