js基本类型和引用类型

基本类型和引用类型

在mdn中,js数据类型被分为原始类型和对象类型,也叫基本类型和引用类型。

具体的基本类型和引用类型可以查看mdn:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures

基本类型

1.基本类型值不可变

基本类型的变量存放在栈区,值不可变。不过这里的值不可变说的是不能使用方法改变值,直接再次赋值显然能够改变值的。

let name='zhangsan';
console.log(typeof(name));//string
parseInt(name);
console.log(typeof(name));//string
name=true;
console.log(typeof(name));//true

2.基本类型的变量赋值

基本类型的变量赋值时,会在栈区创建一个新值,赋值与被赋值的变量进行任何操作都不会影响对方。

let nameA='zhangsan';
let nameB=nameA;
console.log(nameB);//zhangsan
nameB='lisi';
console.log(nameA);//zhangsan
console.log(nameB);//lisi

引用类型

1.引用类型值可变

引用类型的值存放在堆栈区,值可变是指可以使用方法改变。

let person={
  name:'zhangsan',
  age:18
};
console.log(person);//{ name: 'zhangsan', age: 18 }
person.name='lisi';
person.age=20;
console.log(person);//{ name: 'lisi', age: 20 }

2.引用类型的变量赋值

引用类型的变量赋值时,也会在栈区创建一个新值,但是这里的栈区存储的值是指向堆区的指针,也就是变量赋值后,栈区的值不同,但是都指向堆区的相同内容,赋值与被赋值的变量进行任何操作都会影响对方。

let personA={
  name:'zhangsan',
  age:18
};
let personB=personA;
console.log(personA);//{ name: 'zhangsan', age: 18 }
personB.name='lisi';
personB.age=20;
console.log(personA);//{ name: 'lisi', age: 20 }
console.log(personB);//{ name: 'lisi', age: 20 }

两种类型堆栈区变化

初始化

let a=1;
let b=1;
console.log(a===b);//true
​
let personA={};
let personB={};
console.log(personA===personB);//false

a和b在栈区值都是1,所以a===btrue。personA和personB堆区值相同,但是指向堆区的栈区值为堆内存地址a和堆内存地址b,所以personA===personBfalse

赋值

let a=1;
let b=a;
console.log(a===b);//true
​
let personA={};
let personB=personA;
console.log(personA===personB);//true

a赋值给b,a和b在栈区值都是1,所以a===btrue。personA赋值给personB,堆区不变,栈区新增指向堆区的栈区值(堆内存地址a),两个变量栈区值相同,所以personA===personBtrue

posted on 2020-11-01 18:26  x_dipper  阅读(48)  评论(0)    收藏  举报

导航