js 世界

基本数据类型和引用数据类型区别

2022-07-05  本文已影响0人  前端末晨曦吖

基本数据类型

string
number
boolean
null
undefined
symbol

引用数据类型

Function
Array
Object
正则

基本数据类型和引用数据类型也有人叫原始数据类型和对象数据类型,拥有方法的类型和不能拥有方法的类型,可变类型和不可变类型

基本类型

基本类型是按值访问的,引用类型是按引用访问

例:

let name = 'mochengxi'
 
name.toUpperCase()
console.log(name); // 输出  'mochengxi'
//可见原值没有改变
 
let person = 'mochengxi';
person.age = 22;
person.method = function(){//...};
 
console.log(person.age); // undefined
console.log(person.method); // undefined
//基本类型不能添加属性和方法

基本数据类型的比较

基本数据类型的比较是值的比较

基本类型的数据类型相同时

基本数据类型的数据类型相同时两个变量的比较就是值的比较, 此时== 和===是一样的
let a = 'mochengxi';
let b = 'mochengxi';
console.log(a == b);//true
console.log(a === b);//true

基本类型的数据类型不同时

基本数据类型的数据类型不同时也是值的比较,只不过不同的是它会对基本数据类型的数据类型进行隐式转换为相同类型后,在进行比较
let a = 1;
let b = true;
console.log(a == b);//true
console.log(a === b);//false

在用 == 比较两个不同类型的变量时会进行一些类型转换。像上面的比较先会把1转化为true进行比较,结果就是true了。

==是值相等即可,===是值和数据类型都必须相等

基本数据类型的存储

基本类型的存储是放在栈内存

基本数据类型赋值

在从一个变量向另一个变量赋值基本类型时,会在该变量上创建一个新值,然后再把该值复制到为新变量分配的位置上
let a = 7;
let b = a;

a ++ ;
console.log(a); // 8
console.log(b); // 7

此时,a中保存的值为 10 ,当使用 a 来初始化 b 时,b 中保存的值也为10,但b中的10与a中的是完全独立的,该值只是a中的值的一个副本,此后,这两个变量可以参加任何操作而相互不受影响。

也就是说基本类型在赋值操作后,两个变量是相互不受影响的

其实基本数据类型就相当于深拷贝,重新开辟了一块内存空间,所以改变其中一个才不会相互影响(深拷贝浅拷贝区别

20200313151119286.png

引用数据类型

引用类型也可以说是对象,对象是属性和方法的集合。
也就是说引用类型可以拥有属性和方法,属性又可以包含基本数据类型和引用数据类型

引用数据类型的值是可变的

可以为引用类型添加属性和方法,也可以删除其属性和方法
let per = {};  //创建对象 -- 引用类型
per.name = 'mochengxi';
per.age = 18;
per.sayName = function(){console.log(per.name);} 
per.sayName();// 'mochengxi'
 
delete per.name; //删除对象的name属性
per.name(); // undefined

说明引用数据类型可以拥有属性和方法,并且是可以动态改变的。

引用类型的值是同时保存在栈内存和堆内存中的对象

引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识
符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。
20200313154859375.png

引用数据类型的比较是引用的比较

let person1 = {};
let person2 = {};
console.log(person1 == person2); // false

引用数据类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同,那很明显,person1和person2在堆内存中地址是不同的;

引用数据类型的赋值

当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。
保存在变量中的是对象在栈内存中的地址,所以,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。
那么赋值操作后,两个变量都保存了同一个对象地址,则这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响
let a = {}; // a保存了一个空对象的实例
let b = a;  // a和b都指向了这个空对象
 
a.name = 'mochengxi';
console.log(a.name); // 'mochengxi'
console.log(b.name); // 'mochengxi'
 
b.age = 18;
console.log(b.age);// 18
console.log(a.age);// 18
 
console.log(a == b);// true 因为他们共用的是同一个地址
无标题.png
上一篇下一篇

猜你喜欢

热点阅读