操作系统常识

Operating System 操作系统 runtime 运行时 kermel 内核 compile 编译

environment 环境 persion 一个人 people 一群人 memory 记忆/存储

开机程序

  1. 操作系统在C盘
  2. 开机按钮 通电后 开始读取固件
  3. 固件就是固定在主板上的存储设备 里面有开机程序
  4. 开机程序将文件里面的操作系统加载到内存中运行

操作系统

  1. 加载操作系统
  2. 启动初始化进程 每个进程都有自己的编号
  3. 启动系统服务 :文件 安全 联网
  4. 等待用户登录
  5. 运行shell 图形化界面可以认为是另一种Shell

浏览器的功能

  • 发起请求,下 载HTML,解析HTML,下载 CSS,解析CSS,渲染界面,下载 JS,解析JS,执行JS等
  • 功能模块:用户界面、渲染引擎、JS引擎、存储等(JS是单线程)
  • 上面功能模块一般各 处于不同的线程(比进程更小)
  • 如果进程是车间,那么线程就是车间里的流水线

06 JS内存瓜分和原型链 - 图1

JS引擎

主要功能

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

瓜分内存(不完整)

06 JS内存瓜分和原型链 - 图2

OS一个区域

chrome 是一个进程

JS 一部分存代码 在不知道什么区里面 ,这个区是将环境存在这个去里面 同时还有变量名。例如 var a 。

红色区不存变量名

stack是栈区 这里放数据 每个数据顺序存放 非对象都存在Stack

heap堆区 这里放数据 每个数据随机存放 对象都存在heap

  1. var a= 1
  2. var b= a
  3. var p = {name:'frank', child:{name:'jack'}}
  4. var p2 = p

06 JS内存瓜分和原型链 - 图3

数据分两种:非对象和对象(数组是对象 函数是对象 )(数字 布尔 字符串 都不是对象)

非对象都存在Stack

对象都存在Heap

=号总是会把右边的东西复制到左边(不存在什么传值和传址)

06 JS内存瓜分和原型链 - 图4

06 JS内存瓜分和原型链 - 图5

关于window

window变量和window对象是两个东西

window变量是一个容器,存放window对象的地址

window对象是Heap里的一坨数据

不信的话,可以让var X=window,那么这个X就指向了window对象,window变量可以不用了

但是这样的代码会弄晕新手,所以不要这样写

同理

console和console对象不是同一个东西

Object和Object函数对象不是同一个东西

前者是内存地址,后者是一坨内存

JS原型链

引一篇文章,里面说的比较透彻:点击这里

下面所有的—proto— 都是

  1. __proto__

首先我们要先知道 函数是对象的一种

  1. —proto—、 constructor属性是对象所独有的;
  2. prototype属性是函数独有的;
  3. 上面说过js中函数也是对象的一种,那么函数同样也有属性proto、 constructor;

这里引出一个例子,这个在JS中是不会报错的

  1. var obj = {}
  2. obj.toString()
  3. var a = [1,2,3]

我们不妨画一个内存图出来看一下:

06 JS内存瓜分和原型链 - 图6

obj 和 arr 都有一个隐藏属性 —proto—

—proto— 隐藏属性存储了Array.prototype对象的地址

arr.keys发现arr上没有 keys

就去隐藏属性对应的对象里面找

于是就找到了Array.prototype.keys

  1. a.keys === window.Array.prototype.keys
  2. //这里在控制带得出 true

同理 obj.toString 也是上面的原理

—proto— 隐藏属性存储了Object.prototype对象的地址

obj 变量指向一个空对象,这个空对象有个 —proto— 属性指向 window.Object.prototype。

obj.toString()在调用的时候,本身没有toString 就回去 obj.—proto— 里面去找

也即是下面的代码的意思

  1. obj.toString === window.Object.prototype.toString
  2. //这里在控制带得出 true

XXX.prototype存储了XXX对象的共同属性 共同属性就是原型

—proto— 就是原型 原型让你无需重复声明共有属性(省内存,省代码)

  1. var obj = {}
  2. // 输出
  3. obj //有个隐藏属性
  4. var array = []
  5. // 输出
  6. array //有个隐藏属性

小贴士

一层是可以篡改的 二层是不会被篡改

我们只关心小写属性的隐藏对象 不关心首字母大写的隐藏属性

原型链图

06 JS内存瓜分和原型链 - 图7

在上图我们可以得出结论:万物继承自Object.prototype。