1、文章简介:
本文会梳理基本数据类型和引用数据类型原理和区别,相信你会有收获。
2、数据类型
基本数据类型有 undefined、Null、Number、String、Boolean、symbol
引用数据类型有 Array、Function、Object
3、基础数据类型
基础数据类型的特点:
1、基本数据类型的值是不可变的,任何方法都无法改变一个基本数据类型的值
var age = 'You'
age[0] = 'M'
console.log(age) //You
发现了吗,我们通过下标是无法改变字符串age
的值的
下面是另一个例子:
2、基本数据类型不可以添加属性和方法
var meili= 'xiaoming'
meili.age = 100
meili.method = function(){...}
console.log(meili.age) //undefined
console.log(meili.method) //undefined
3.基本数据类型的比较是值的比较
//只有在值相等的时候才会相等
var a = 1
var b = 1
console.log(a === b) //true
例二
var a = 'csdn';
var b = 'csdn1';
console.log(a === b); //false
4、基本类型的值被保存在栈内存中,在内存中占据固定大小的空间
下面是一些基础类型变量
var a = 10
var b = 'csdn'
var c = 'csdn1'
栈内存 |
---|
a | 10 |
---|---|
b | csdn |
c | csdn1 |
栈内存包含了变量的标识符和变量的值
4、引用数据类型
js除了上面的基础类型就是引用类型
包括 Array,Date,Function,Object 也就是说是对象了,
1、对象是属性和方法的集合,那么就是说引用类型也同样拥有
var person = {};//创建个控对象 --引用类型
person.name = 'jozo';
person.age = 22;
person.sayName = function(){console.log(person.name);}
person.sayName();// 'jozo'
delete person.name; //删除person对象的name属性
person.sayName(); // undefined
上面这段代码说明引用类型拥有属性和方法 同时可以动态改变
2.引用类型的地址保存在栈中,值保存在堆中
js中引用类型不能直接操作对象的内存空间,实际上是操作对象的引用。引用类型的值是按引用访问的。引用类型的储存需要内存的栈区和堆区共同完成。
引用类型的值大小不固定,栈内存中存放地址,堆内存中存放对象,地址指向堆内存中的对象。引用地址的大小是固定的,所以栈区内存保存地址。这样,当查询引用类型时,先从栈中读取内存地址,然后再通过地址找到堆中的值,对于这种我们称为引用访问。
3.引用类型的比较是引用的比较
var son1 = '{}';
var son2 = '{}';
console.log(son1 == son2); // true
这是两个基本类型字符串的比较,也就是上面总结的值的比较 所以为true,再往下看
var person1 = {};
var person2 = {};
console.log(person1 == person2); // false
这里就是两个对象作比较了 为什么为false呢,引用访问时是按照引用地址访问的,也就是我们对比的是引用地址,如图两个地址是不相等的所以返回为false
以上叙述了基本类型和引用类型的区别
ps > 为什么会有栈内存和堆内存之分?
通常与垃圾回收机制有关。为了使程序运行时占用的内存最 当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;
当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。