Skip to content

值类型和引用类型

原始类型,也叫值类型,还可以被称为不可变类型

对象类型,也叫引用类型,还可被称为可变类型

js
// 值类型
var a = 100;
var b = a;
a = 200;
console.log(b); //100
console.log('');


// 引用类型
var obj1 = {age: 100};
var obj2 = obj1;  //由于是引用类型,obj1给obj2是地址,导致obj1和obj2指向一个对象
obj1.age = 200;
console.log(obj2.age); //200
console.log('');


// 对变量重新赋值
// 起始是把obj2指向了新的对象, obj2和obj1再无关系了。
obj2 = {}; // 给obj2重新赋值了一个对象 (和修改obj2的属性不一样)

区别

js
1. 内存存储方式
   值类型: 
   引用类型: 

2. 赋值方式(传值方式)
   值类型: 
   引用类型:

3. 可变和不可变
   值类型: 
   引用类型: 

4. 判等方式
   值类型: 
   引用类型:

值类型和引用类型的内存存储方式

值类型的特点:占用空间固定,变量名和变量都保存在栈内存中。

image-20240311123942525

引用类型的特点: 变量的值存储在堆内存中,而栈内存中存储的是变量名和值的地址。

image-20240311123934683

值类型和引用类型经典面试题

js
//1、
var num1 = 10;
var num2 = num1;
num1 = 20;
console.log(num1);
console.log(num2);


//2、
var num = 50;
function f1(num) {
    num = 60;
    console.log(num);
}
f1(num);
console.log(num);


//3、
var num1 = 55;
var num2 = 66;
function f1(num, num1) {
    num = 100;
    num1 = 100;
    num2 = 100;
    console.log(num);
    console.log(num1);
    console.log(num2);
}
f1(num1, num2);
console.log(num1);
console.log(num2);
console.log(num);


// 4、
// 函数传参如果传的是基本数据类型和传引用(对象)有什么区别
//4-1、
var a = 10;
var b = 20;
function add(a,b){
    a = 30;
    return a + b;
}
add(a,b);
console.log(a);
//4-2、
function f1(arr){
    for(var i = 0; i < arr.length; i++){
        arr[i] += 2
    }
    console.log(arr);
}
var arr;
arr = [1,2];
f1(arr);
console.log(arr);


// 5、
// 两个对象是同一个对象,不同的操作有什么不同
var a = [1,2];
var b = a;
a[0] = 20;    // 如果a = [20,2];会怎么样
console.log(b);


//6、
function Person(name, age, salary) {
    this.name = name;
    this.age = age;
    this.salary = salary;
}
function f1(pp) {
    pp.name = "ls";
    pp = new Person("aa", 18, 10);
}
var p = new Person("zs", 18, 1000);
console.log(p.name);
f1(p);
console.log(p.name);
console.log(pp.name);

数据类型的本质

具有相同构造函数的对象,就是同一种数据类型。