内存图与JS世界

94 阅读2分钟

7.1 开机的过程

通电 --> 读取固件, 读取里面的开机程序 --> 开机程序将操作系统加载到内存

加载操作系统内核 --> 启动初始化进程(pid=1) --> 启动系统服务: 文件, 安全, 联网 --> 用户登陆 --> 启动shell


浏览器输入地址然后发生了什么?

下载HTML, 解析HTML, 下载CSS, 解析CSS, 渲染页面, 下载载入js, 执行js.(边解析HTML, 边下载CSS也是可以的)


为什么说Dom操作慢?

页面是进程, 渲染引擎是线程, Dom操作是跨线程操作,所以很慢.

7.2 JS引擎

v8引擎编写的语言是 c++, 所以非常的快

引擎功能:

  • 编译
  • 优化代码, (在引擎层面做代码优化的话,过于优秀). 所以: 优化技巧跟着v8引擎建议
  • 执行字节码,机器码
  • 垃圾回收.

7.3 执行js之前的准备

执行js代码前, 浏览器要干什么?

  1. 提供浏览器提供给js的api(运行环境), 包括window/document/setTimeout

  2. js放进页面就开始运行

js代码放进内存

不知道区存变量名, 非对象存Stack区, 对象数据存Heap区((但是会放一个地址在stack))

7.4 JS入门三座大山之原型

window是什么?

  • console, document, Object, Array, Function挂到window
  • window 公交车, 谁都可以挂, 在任何地方都能直接使用(相当于全局变量).
  • window的属性存的是地址.
  • 变量指地址, 对象是数据, window变量,window对象也不例外

Tips: console.dir()打印结构


压在JS学习者身上的三座大山是什么?

三座大山:

  1. this
  2. 原型
  3. AJAX

原型是啥?

原型: 就是共有属性, 能省内存.也就是下面的__proto__

Tips: Object也有隐藏属性


prototype 和__proto__的区别是什么?

  • 首字母大写的对象:才有 有prototype属性, 不要关心__proto__

  • 小写才关心: `proto

空对象有一个隐藏属性fuck, 指向Object.prototype #409, 数组指向:Array.prototype##9527, 包含常用的函数

能不能修改__proto__中的函数?

直接引用无法修改. 这样做只给自己增加了一个同名的属性.

var a = [1, 2, 3]
var b = a
b.push = 'xxx' //修改的不是原型, 而是给自己添加了一个push
a.push //'xxx'


var a = [1, 2, 3]
var b = [1, 2, 3]
b.push = 'xxx' //修改的也不是原型
a.push // fuction