JS浏览器、引擎、内存图、原型

82 阅读2分钟

浏览器的功能

  • 渲染引擎是下载HTML、JS和解析HTML、JS

  • JS引擎是解析、执行JS

(进程假如是车间,那么线程就是车间里的流水线)

  • JS是单线程的,JS如果要渲染,要跨线程通信

JS引擎的主要功能

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

内存图

7.png

8.png

9.png

1. Stack和Heap举例

  • 两者区别
  1. Stack必须顺序存储数据
  2. Heap随机存储数据
var a = 1 
var b = a
var p = {name:'jk',child:{name:'jc'}}
var p2 = p

6.png

  • 对象被篡改
var p = {name:'jk'}
var p2 = p
p2.name = 'hi'
console.log(p.name)  
// 'hi'

p 和 p2 都保存了同一个对象的地址,所以修改 p2.name 会影响 p.name

左边是变量,右边是对象

1.1 规律

  • 数据分两种:非对象(数字、字符串、bool)和对象(数组、函数)
  • 非对象都存在Stack
  • 对象都存在Heap
  • = 号 总是会把右边的东西复制到左边(不存在什么传值和传地址)

JS一开始就有的属性window , 除此之外还有什么

还有:
1.  console

2.  document

3.  对象= Object = window.Object
var p = {} 等价于 var p = new Object()

4.  数组 = Array = window.Array
var a = [1,2,3] 等价于 var a = new Array(1,2,3)

5.  函数 = Function = window.Function
function f(){}  等价于 var f = new Function()

  • 第一个字母大写,一般都有prototype属性

Object 和 object 的区别是什么?

  1.  Object 是一个全局函数,可以用来生成对象,var obj = new Object() ,可以简写成 var obj = {};而 object 什么也不是,除非我声明一个 var object

JS原型链

  • prototype 是干嘛的

10.png

image.png

  • 假设我创建一个var obj2 = obj , 然后篡改obj里面的tostring = f1,请问obj2里面的tostring会被篡改成f1吗,答案是不会,只能改一层,不能改两层

每个属性都有一个隐藏属性__proto__

11.png

  • prototype挂载在大写的 Object 上
  • __proto__挂载在小写的 obj 上

关于原型(共有属性)

  1.  Object.prototype 保存了一个对象的地址,这个对象包含了所有普通对象的共有属性,叫做对象的原型
  2.  Array.prototype 保存了一个对象的地址,这个对象包含了是所有数组的共有属性,叫做数组的原型
  3.  Function.prototype 保存了一个对象的地址,这个对象包含了是所有函数的共有属性,叫做函数的原型
  4.  每个对象都有一个隐藏属性,用来保存其原型的地址,这个隐藏属性的名字叫做 __proto__