浅谈js内存:https://www.jianshu.com/p/396c110378db

基本类型又叫做值类型,复杂类型又叫做引用类型 值类型:简单数据类型,基本数据类型,在存储时,变量中存储的是值本身,因此叫做值类型。 引用类型:复杂数据类型,在存储是,变量中存储的仅仅是地址(引用),因此叫做引用数据类型。

堆和栈

堆栈空间分配区别:
1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
2、堆(操作系统): 存储复杂类型(对象),一般由程序员分配释放, 若程序员不释放,由垃圾回收机制回收,分配方式倒是类似于链表。

  • 注意:JavaScript中没有堆和栈的概念,此处我们用堆和栈来讲解,目的方便理解和方便以后的学习。

    a) 基本类型在内存中的存储

    1.jpg

    b) 复杂类型在内存中的存储

    简单类型和复杂类型的区别 - 图2

    c) 基本类型作为函数的参数

    2.jpg
    image.png

    d) 复杂类型作为函数的参数

    3.jpg
    https://www.cnblogs.com/liuyushao/p/6875341.html
    // 下面代码输出的结果
    1. function Person(name,age,salary) {
    2. this.name = name;
    3. this.age = age;
    4. this.salary = salary;
    5. }
    6. function f1(person) {
    7. person.name = "ls";
    8. person = new Person("aa",18,10);
    9. }
    10. var p = new Person("zs",18,1000);
    11. console.log(p.name);
    12. f1(p);
    13. console.log(p.name);
    image.png

思考:
//1.

  1. var num1 = 10;
  2. var num2 = num1;
  3. num1 = 20;
  4. console.log(num1);
  5. console.log(num2);

image.png

//2.

  1. var num = 50;
  2. function f1(num) {
  3. num = 60; //此函数内部有一个变量num,修改的是当前函数内部的num
  4. console.log(num);
  5. }
  6. f1(num);
  7. console.log(num);

image.png

//3.

  1. var num1 = 55;
  2. var num2 = 66;
  3. function f1(num, num1) {
  4. num = 100;
  5. num1 = 100;
  6. num2 = 100;
  7. console.log(num);
  8. console.log(num1);
  9. console.log(num2);
  10. }
  11. f1(num1, num2);
  12. console.log(num1);
  13. console.log(num2);
  14. console.log(num);

image.png

e) 值传递和址传递

//值传递

  1. var a = 1;
  2. var b = 2;
  3. function changeA(a,b){
  4. var tmp = a;
  5. a = b;
  6. b = tmp;
  7. }
  8. changeA(a,b);
  9. console.log(a,b);

image.png

//址传递

  1. var a = [1,2];
  2. function changeB(a){
  3. var tmp = a[0];
  4. a[0] = a[1];
  5. a[1] = tmp;
  6. }
  7. changeB(a);
  8. console.log(a);

image.png