美文网首页
初窥JS世界以及内存图详解

初窥JS世界以及内存图详解

作者: 郑馋师 | 来源:发表于2019-09-29 19:10 被阅读0次

    操作系统

    常用英语

    1. shell
      操作界面
    2. os
      操作系统
    3. runtime
      运行时(也就是运行时所需要的东西)
    4. kernel
      内存
    5. compile
      编码

    过程

    1. 开机过程
    • 通电
    • 读取固态硬盘
    • 将操作系统加载到内存
    1. 打开chrome
      每开一个网页就会开一个新的进程

    chrome功能

    • 发起请求
    1. 下载HTML,CSS,JS
    2. 解析HTML,CSS,
    • 功能模块(说是功能模块其实也是代码拼砌得到的)
    1. 网页界面
    2. 渲染引擎
      主要用于渲染HTML,CSS,如果JS要渲染也会在这里渲染。渲染的意思就是在HTML,CSS解析后,将他们放在屏幕上成为样式的过程。
    3. JS引擎
      解析执行JS
    4. 储存
      Tips:
    5. 进程>子进程>线程,子进程是进程但是线程不是,他是进程下面的一级单位
    6. 一般来说,要把程序加载到内存才能运行
    7. 双击 Chrome 快捷方式,会启动一个 Chrome 进程,这个进程会启动其他子进程,每开一个新的页面,都会开一个JS线程和一个渲染线程,如果JS要渲染一定要跨线程通信,在渲染引擎中渲染。这样会比别的同线程通信的慢。
    8. 线程不是进程,线程是一种比进程更轻量的概念
    9. JS 只能单线程执行,
      我们将着重分析JS引擎和储存部分

    JS引擎

    chrome的JS引擎是V8引擎,C++编写的,这并不是第八代,而仅仅是作者写了很多不同类型的引擎,第八个类型正好是JS。

    功能
    1. 编译:把JS代码翻译成机器能够看懂执行的字节码
    2. 优化:改写代码,使其更加的高效
    3. 执行:执行上面的机器码/字节码
    • 准备工作:
      1.提供API,也就是运行环境,提供window/document/SetTimeout,这些事JS里面没有的,浏览器提供的
    1. 把JS放进页面
    • 执行JS
    1. 垃圾回收:把JS用完的内存回收,方便下次用

    内存

    内存的模样

    每一格就是一个内存区域。

    1. 每一个内存区域的构造如图: 内存构造
    2. 而在chrome进程中


      chrome进程
    3. 而在JS引擎中


      JS引擎

      Tips:

    4. Stack区是连续储存,Heap是随机存放,哪里有地方就放在哪里,这两个区合起来是数据区,用于存放数据,里面没有变量名,所有变量名字都存在了‘不知道什么区’里面

    5. 每个浏览器的分配规则不同,这里只介绍chrome的

    6. 上图区域并不完整,还有调用栈等没画

    数据区
    1. 如果有会改变的量存在Heap区,因为Heap是随机存的,Stack是按顺序,如果在stack中,改变其中一个要全部下面都要改动,非常低效。在Heap区存储的数据会产生一个内存地址,这个地址会存在Stack区。一般来说:对象在Heap,非对象在Stack
      eg.
    let p={
    name:'Jack'
    child:'Tom'}
    

    此时假设p生成的地址是#300,child是#200


    储存例子

    Tips:

    1. =是赋值,将右边的复制到左边,===才是等于
      eg.
    let p={name:'jack'}
    let p1=p
    p1={name:'x'}
    

    则它们两个的内存地址是相同的,且这个时候p和p1name都是x

    JS相关的与数据区关系

    写代码前,浏览器提供

    1. Window
    2. Window.Console(控制台)
    3. Window.Document(文档)
    4. Window.Object(对象)
    5. Window.Array(数组)
    6. Window.Function(函数)
      Tips:
    7. 23456都是挂在window下面,可以直接使用,目的是为了方便,可以直接用而不是每次重新打
    8. window变量和window对象不同,变量是存放对象的地址,是存放在stack的内存地址,对象则是在Heap区的数据
    JS三座大山之原型与数据区关系

    JS三座大山

    • 原型
    • AJAX
    • this

    原型

    原型
    每个对象都有原型

    1. 原型里存着对象的共有属性
      eg. obj 的原型就是一个对象

    2. obj.__proto__存着这个对象的地址
      这个对象里有 toString/constructor/valueOf 等属性

    3. 对象的原型也是对象

    4. 所有对象的原型也有原型
      obj={}的原型即为所有对象的原型, 这个原型包含所有对象的共有属性,是对象的根
      这个对象的共有属性的这个原型也有原型,是 null

    5. 所有函数一出生就有一个 prototype 属性

    • 所有 prototype 一出生就有一个 constructor 属性
    • 所有 constructor 属性一出生就保存了对应的函数的地址
    • 如果一个函数不是构造函数,它依然拥有 prototype 属性,只不过这个属性暂时没什么用

    原型和数据区关系

    每一个新的object(对象)/array(数组)/function(函数)里面都有一个隐藏的属性,为proto,它里面有很多属性,而且与Window.Object(对象)/ Window.Array(数组) /Window.Function(函数)里面的隐藏属性Prototype内存地址相同,这里Prototype里面就是这些object(对象)/array(数组)/function(函数)的共有属性,我们称之为原型,可以方便你写代码更快而不用每个属性都重新写。这些都是浏览器开始就写好的,不然用到常用指令还要自己再写很麻烦
    ######## 相关属性

    1. 改对象
      eg
    let a={}
    let b={}
    a.tostring=b.tostring
    b.tostring = 'xx'
    

    此时a.tostring不会是'xx',因为画内存图就可以轻松的知道是怎么回事了,假设隐藏属性proto和Prototype的地址为#409,a为#300,b为#200.


    内存图

    可以发现,这里对b中tostring进行赋值,与a一点关系都没有,因为这里如果b的tostring要指向a需要两次,而且最为关键的是,直接在b中修改tostring是没办法影响到#409里面的属性,而且#409里面的是永远无法通过改变自身的所有属性来改变,谁来都不行,也就无法影响a
    但若是

    let a={}
    let b={}
    a.tostring=‘aa’
    b.tostring = 'xx'
    a.tostring=b.tostring

    这样ab的tostring都是xx了,因为
    ![内存图](https://img.haomeiwen.com/i19247518/bb2a3eeb479696e9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    他们只有一次指向,可以直接修改。
    
    **因此!!!如果内存图只有一次指向,就可以直接修改,两次或以上的指向就没办法修改**
    Tips:
    1. 所有大写开头的,
    1. Window
    2. Window.Console(控制台)
    3. Window.Document(文档)
    4. Window.Object(对象)
    5. Window.Array(数组)
    6. Window.Function(函数)
    都有Prototype,也就是原型,小写的都有proto这个隐藏属性,这里的共有属性是没法修改的,只能读取。
    ## 原型链
    修改原型:
    `object.create(common)`
    eg.
    
    

    var common={'name':'xxx'}
    var person=object.create(common)

    ![原型链](https://img.haomeiwen.com/i19247518/c9494b880ddccaa2.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    

    相关文章

      网友评论

          本文标题:初窥JS世界以及内存图详解

          本文链接:https://www.haomeiwen.com/subject/pbahuctx.html