JavaScript基础——简单类型和复杂类型


JavaScript简单类型和复杂类型

回顾数据类型

  • 简单数据类型 / 基本数据类型 / 值类型

    • Number
    • String
    • Boolean
    • Null
    • Undefined
  • 复杂数据类型 / 引用类型

    • Object
    • 数组

数据在内存中的存储

JavaScript中没有堆栈的概念,通过堆栈的方式来理解代码的一些执行方式,便于将来学习其他语言。

  • 简单类型存储在内存中的栈上
  • 复杂类型存储在内存中的堆上

简单类型在内存中存储

var n1 = 10;
// 1、在栈中开辟一块内存空间,存储一个数值10
// 2、将 n1 变量的值指向该内存空间
var n2 = n1;
// 1、在栈中又开辟一块内存空间
// 2、把 n1 指向的数值10复制一份放进新开辟的内存空间中
// 3、将 n2 变量的值指向新开辟的内存空间

n1 = 20;
// 变量 n1 的值发生变化, n2 的值不会发生变化

复杂类型在内存中存储

function Object(name, age) {
    this.name = name;
    this.age = age;
    this.sayHi = function () {
        console.log(this.name + ":hello")
    }
}

var o1 = new Object('lisi', 18);
// 1、 在堆上开辟一块内存空间,存储o1对象
// 2、 在栈上开辟一块内存空间,存储一个二进制地址,地址指向堆上的p1对象
// 3、 变量o1指向栈上开辟的内存空间(二进制地址)
var o2 = o1;
// 1、在栈中又开辟一块内存空间
// 2、把o1指向的二进制地址复制一份放进新开辟的内存空间
// 3、将o2指向新开辟的内存空间
o1.name = 'zhangsan';
// o1对象的name属性更改为 zhangsan
console.log(o2.name); // zhangsan
// o2对对象的name属性也更改为 zhangsan ,因为指向的都是栈上的同一个二进制地址,二进制地址指向的是同一个o1对象

简单类型作为函数的参数

function fn() {
    a = a + 1;
    b = b + 1;
    console.log(a);
    console.log(b);
}

var x = 10;
// 1、在栈中开辟一块内存空间,存储一个数值10
// 2、将 x 变量的值指向该内存空间
var y = 20;
// 1、在栈中开辟一块内存空间,存储一个数值20
// 2、将 y 变量的值指向该内存空间
fn(x, y); // 11 21
// 1、在栈中又分别开辟两块内存空间
// 2、把 x 和 y 指向的数值10和数值20分别复制一份放进新开辟的两块内存空间中
// 3、将 a 变量的值 和 b 变量的值分别指向对应的新开辟的内存空间
// 4、a的值和b的值经过运算重新变为 11 和 21
console.log(x); // 10
// x 的值还是10
console.log(y); // 20
// y 的值还是20

复杂类型作为函数的参数

function Person(name, age) {
    this.name = name;
    this.age = age;
    this.sayHi = function () {
        console.log(this.name + "Hello!");
    }
}

var p = new Person("zhangsan", 18);
function fn(person) {
    person.name = "lisi";
}
fn(p);
console.log(p.name); // lisi
function Person(name, age) {
    this.name = name;
    this.age = age;
    this.sayHi = function () {
        console.log(this.name + "Hello!");
    }
}

var p = new Person("zhangsan", 18);
function fn(person) {
    person.name = "lisi";
    person = new Person("wangwu", 20)
    console.log(person.name) // wangwu
}
fn(p);
console.log(p.name); // lisi
function sort(array) {
    for (var i = 0; i < array.length; i++) {
        var isSort = true;
        for (var j = 0; j < array.length - 1 - i; j++) {
            if (array[j] < array[j + 1]) {
                isSort = false;
                var tmp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = tmp;
            }
        }
        if (isSort) {
           break; 
        }
    }
    // return array; 可以不用写return返回值,因为数组是一个复杂数据类型,具有复杂数据类型函数传参的特性
}

var arr = [10, 51, 81, 2, 5, 9, 57, 58];
sort(arr);
var r = sort(arr);
console.log(r); // undefined 没有写return就没有返回值,所以返回undefined
console.log(arr); // [81, 58, 57, 51, 10, 9, 5, 2]