zoukankan      html  css  js  c++  java
  • JS变量小总

    变量分类:
    1、栈内存(stack)和堆内存(heap)
    2、基本类型和引用类型

    #栈内存(stack)
      一般为静态分配内存,其分配的内存系统自动释放。

    #堆内存(heap) 
      一般为动态分配内存,其分配的内存,系统不释放,哪怕程序退出,那一块还是在那里。

    #为何会有栈内存和堆内存之分
    1、 和垃圾回收机制有关。为了使程序运行时占用的内存最小;
    2、 当一个方法执行时,每个方法都会建立自己的栈内存,在这个方法内定义的变量将会逐个放入这块栈内存中,随着方法的执行结束而销毁;
    3、 当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用,这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的传递参数时很常见),则这个对象依然不会被销毁,只有当一个对象内有任何引用变量引用时,系统的垃圾回收机制才会在核实的时候回收它;

    *基本类型五类:

      Number、String、Null、Undefined、Boolean,这些类型在内存中分别占有固定大小的空间,它们的值保存在栈空间,我们是通过值来访问的;

    *引用类型:
      Array、Date、Math、RefExp、Function等
    Object对象(指保存在堆内存中的对象);引用类型,值大小不固定,栈内存中存放地址指向堆对象。

    #简单说明:
      栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值不固定,因此不能把他们保存到栈内存中。但内存地址大小是固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,先从栈中读取内存地址,然后再通过地址找到堆中的值。

    基本类型和引用类型的区别(操作数据的值)
      实际区别是传值与传址;

    %传值:
      在赋值过程中,首先对值进行了一份拷贝,而后将这份拷贝存储到一个变量、对象属性或数组元素中。
      拷贝的值和原始的值是完全独立、互不影响的。
      当一份数据通过值传递给一个函数,实际上被传递的不是数据本身,而是数据的一份拷贝。
      因此,如果函数修改了这个值,影响到的只是数据的那份拷贝,而并不影响数据本身。

    %传址:
      在赋值过程中,变量实际上存储的是数据的地址,而不是原始数据或者是数据的拷贝。
      如果值通过一个地址发生了改变,这个改变也会通过原始地址表现出来。

    &浅拷贝:
      浅拷贝指只是复制一层对象,当对象的属性是引用类型的时,实质复制的是其引用地址,两个对象指向同一个内存地址时修改其中任意值,另一个值也会随之改变;(在定义一个对象或数组时,变量存放的往往只是一个地址。当我们使用对象拷贝时,如果属性是对象或数组时,这时我们传递的也只是一个地址。因此子对象在访问该属性时,会根据地址回溯到父对象的堆内存中,此时父子对象发生了关联,两者的属性值会指向同一存储空间;)


    &深拷贝:

      深拷贝是指复制对象的所有层级,将对象及其值都复制过来,两个对象修改其中任意的值另一个值不会改变。

    &深拷贝的实现方法:

    1、 通过递归方法实现;
    2、 通过JSON解析实现;对象转成JSON字符串再转成JSON对象:JSON.parse( JSON.stringify(o) );
  • 相关阅读:
    6月7日の勉強レポート
    6月6日の勉強レポート
    6月5日の勉強レポート
    6月4日の勉強レポート
    6月3日の勉強レポート
    6月2日の勉強レポート
    6月1日の勉強レポート
    linux 文件属性
    linux网卡配置
    redhat6修改主机名
  • 原文地址:https://www.cnblogs.com/Angxf/p/10957037.html
Copyright © 2011-2022 走看看