js数据类型

1.变量可以存放两种类型的值: 原始值 和 引用值
2.
3.引用值指的是复合数据类型的值,包括 Object、Function、Array、Date、RegExp。

1.原始值

原始值代表原始数据类型的值,也叫基本数据类型。原始值类型分为五类:Stirng、Number、Boolean、Null、Underfined。

1.字符串类型/String

【创建方法】
var str=’abc’;

2.数字类型/Number

【创建方法】
var num=123;

3.布尔类型/Boolean

【创建方法】
var bool01=true;
var bool02=false;

4.Null

【创建方法】
var nu=null;

5.Undefined

【创建方法】
var un;

null == undefined这样的去判断返回的只是值的相等 (返回true)
null === undefined这样的判断就是判断对象的值和类型都要相等(返回false)

2.引用值

引用值是指一些复合类型数据的值,引用类型有object,Array等(对象,数组,函数)

1.对象类型/Object

【创建方法】
var obj01=new Object();
var obj02={};
function obj03(n){
var obj=new Object();
obj.name=n;
return obj;
}
var a=obj03(‘创建方法03’);
function Obj04(n){
this.name=n;
}
var b=new Obj04((‘创建方法04’);

2.数组类型/Array

【创建方法】
var arr01=[]; 创建数组的方法01
var arr02=news Array(); 创建数组的方法02

3.函数类型/Function

【创建方法】
//函数申明
function fun01(n){
return n;
}
//函数表达式
var fun02=function(n){
return n;
}

3.栈内存和堆内存

存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。根据数据类型的的不同,有的变量存储在栈中,有的存储在堆中

1.栈内存

存放基本类型的变量,对象的引用和方法调用,遵循先入后出的原则。

栈内存,在函数中定义的“一些基本类型的变量和对象的引用变量”都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

Java中的代码是在函数体中执行的,每个函数主体都会被放在栈内存中,比如main函数。假如main函数里调用了其他的函数,比如add(),那么在栈里面的的存储就是最底层是main,mian上面是add。栈的运行时后入先出的,所以会执行时会先销毁add,再销毁main。

栈内存的优势:栈内存与堆内存相比是非常小的,存取速度比堆要快,仅次于寄存器,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。

栈内存的缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄。

2.堆内存

所有new出来的对象和数组。

注 意:堆内存和数据结构中的堆完全是两码事,分配方式类似于链表。

堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间,堆内存实际上指的就是(满足堆内存性质的)优先队列的一种数据结构,第1个元素有最高的优先权

在堆内存分配时首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。

另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。堆内存是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆内存的大小受限于计算机系统中有效的虚拟内存。由此可见,堆内存获得的空间比较灵活,也比较大。堆内存是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

栈与堆都是Java用来在Ram中存放数据的地方。与C ++不同,Java自动管理栈和堆,程序员不能直接设置栈或堆 。

Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过新的,newarray,anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的。

堆内存的优势:可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的的垃圾收集器会自动收走这些不再使用的数据。
堆内存的缺点:由于要在运行时动态分配内存,存取速度较慢。

3.栈内存和堆内存之间的区别

1、应用程序所有的部分都使用堆内存,然后栈内存通过一个线程运行来使用。
2、不论对象什么时候创建,他都会存储在堆内存中,栈内存包含它的引用。栈内存只包含原始值变量好和堆中对象变量的引用。
3、存储在堆中的对象是全局可以被访问的,然而栈内存不能被其他线程所访问。
4、栈中的内存管理使用LIFO的方式完成,而堆内存的管理要更复杂了,因为它是全局被访问的。
5、栈内存生命周期很短,堆内存的生命周期从程序的运行开始到运行结束。
6、我们可以使用-Xms和-Xmx JVM选项定义开始的大小和堆内存的最大值,我们可以使用-Xss定义栈的大小。
7、当栈内存满的时候,Java抛出java.lang.StackOverFlowError异常;而堆内存满的时候抛出java.lang.OutOfMemoryError: Java Heap Space错误
8、和堆内存比,栈内存要小的多,因为明确使用了内存分配规则(LIFO),和堆内存相比栈内存非常快。
9.对于栈内存和栈内存之间的值是拷贝关系,当改变一个栈的内容,不会影响其它栈的内容,栈与栈是互相不影响的。

4.原始值和引用值的区别

1.原始值放在栈(stack)中,引用值放在堆(heap)中
2.原始值存储在栈中。意思就是说,当一个原始变量把值赋给另一个原始变量时,只是把栈中的内容复制给另一个原始变量,此时这两个变量互不影响,即当一个变量值改变时,另一个变量不会因此而发生任何变化。

var a = 10 ;
var b = a ;
a = 20;
console.log(b);     //输出10 b的值不会因a的值的改变而该改变

3.引用值与原始值不同,引用值把引用变量存储在栈中,而实际的对象存储在堆中。每一个引用变量都有一根指针指向其堆中的实际对象。

var a = [1,2,3] ;  
var b = a ; 
a.push(4) ;
console.log(b) ;     //输出1,2,3,4 
a = [12] ;
console.log(b) ;     //输出1,2,3,4 
console.log(a) ;     //输出12

引用值a赋值给b时,各自的变量名存储在栈中,而实际对象值都指向堆中的同一个地址,当变量a通过方法改变值时,实际上时改变堆中内容,因此,此时b的值也会相应的改变。当a通过非方法改变值时,系统会为该引用变量重新创建一个堆房间,此时,a的指针指向新的堆地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值