操作系统常识

一切都运行在内存里
开机

按开机键——主板通电——读取固件——加载开机程序——将文件里的操作系统加载到内存运行

操作系统(以Linux为例)

  • 加载内核——启动初始化进程——启动系统服务(文件、安全、联网)——等待用户登录——登录后运行 shell
  • bash 是一种 shell ,图形化界面也可以认为是一种 shell

浏览器

开启浏览器进程作为主进程,它会开启一些辅助进程,如网络服务,GPU加速,每新建一个网页,都有可能开启一个子进程。

浏览器的功能

发起请求,下载 HTML,解析 HTML,下载 CSS,解析 CSS,渲染界面,下载 JS,解析 JS,执行 JS等,JS 想要去修改 HTML 或者 CSS 需要线程通信,这就叫跨线程通信,也是 DOM 操作慢的原因。

功能模块:用户界面、渲染引擎、JS 引擎、存储等,功能模块一般都处于不同线程。

线程:是操作系统能够进行运算调度的最小单位,JS 就是单线程的。

上面功能模块一般各处于不同的线程(比进程更小一级的东西)
理解:例如百度打开一个知乎网页,知乎网页这个页面上运行渲染引擎和JS引擎,知乎已经是一个进程了,而这两个引擎在知乎页面内运行,成为线程。
每一个页面都会开启一个渲染线程和JS线程。

问:JS是怎么渲染的?
答:线程通信,JS要修改HTML或者CSS,不能直接修改,要通过线程之间的通信来通知渲染引擎,这叫做跨线程通信。(谷歌会提供通信接口)

[

](https://blog.csdn.net/sinat_38021004/article/details/118267853)

JS 引擎

主要功能

编译:把 JS 代码翻译为机器能执行的字节码或机器码 优化:改写代码,使其更高效 执行:执行上面的字节码或机器码 垃圾回收:把 JS 用完的内存回收,方便之后再次使用

执行 JS 代码
准备工作
提供API: window / document / setTimeout
这些功能是浏览器提供的,不是 JS 自身具备的功能
这些功能被称为运行环境 ( runtime environment )
JS 代码会在内存中运行
深入研究

  • JS代码在哪里运行?
    答:内存。一个HTML引用了JS,下载后代码放到内存里。
  • 代码放到哪个内存里?
    答:下方内存图解释

内存图

image.png

  • 红色区域存放数据,变量名在不知什么区,每种浏览器的分配规则并不一样
  • 红色区域分为 Stack 栈 和 Heap 堆
  • Stack 区的特点是每种数据顺序存放
  • Heap 区的特点是每种数据随机存放

数据分为两种:非对象和对象(只有数字、字符串、布尔不是对象)

  • 非对象存在 Stack 区
  • 对象存在 Heap 区
  • = 号总是会把右边的东西复制到左边(不存在传值和传址)

以下举例window内存图

image.png

  • 总结该图:
  • window有三个属性,第一个属性指向console;第二个属性Object指向了一个函数,函数有两个属性;Array指向了一个对象,对象也有两个属性(一般第一个字母大写就会有prototype)
  • object是个函数,可以创造一个新的对象,console.dir(window.object),其中dir的意思是打出它的结构,可以显示一个对象所有的属性和方法
  • image.png
  • window 对象和 window 变量是两个东西
  • 变量在不知什么区,对象在 Heap 区
  • 变量是个容器,存放对象的地址
  • 对象只是 Heap 里的数据

JS原型

  • 一般来说,首字母大写就会有 prototype 属性
  • xxx.prototype 存储了 xxx 对象的共同属性,这就是原型
  • 原型的好处:无需重复申明共有属性,可以省代码,省内存
  • 每个对象都有一个隐藏属性 也就是指定原型(对象)

prototype 和 —proto— 的区别

  • 都存着原型的地址
  • 只是 prototype 挂在函数上
  • —proto— 挂在每个新生成的对象上