数据类型
听我来慢慢跟你说,根据Ecmascript规范规定
5种简单数据类型:Undefined, Null, Boolean, Number, String.
1种复杂数据类型:Object。
其中5种简单数据类型又称为基本数据类型,复杂数据类型又称为引用数据类型。
存储结构
以下理论所有程序语言通用:
基本数据类型保存在栈内存,引用数据类型实际上是一个指针,这个指针也保存在栈中,但是这个指针指向的对象则保存在堆内存中。
两种数据访问方式
基本数据类型:按值访问,读写的是它们实际保存的值。 引用数据类型:按引用访问,读写它们时需要先从栈中读取堆内存地址,然后找到保存在堆内存中的值。
两种类型的复制
基本数据类型变量的复制:从一个变量向另一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的空间中。 引用数据类型变量的复制:复制的是存储在栈中的指针,将指针复制到栈中为新变量分配的空间中,而这个指针副本和原指针指向的是同一个堆内存中的对象;复制操作后两个变量实际上将引用同一个对象,因此改变其中一个将影响到另外一个。
基本包装类型
学过java的就更好理解了,拆箱、装箱吧啦吧啦... es沿袭了java语言中基本数据类型不是面向对象的思想,这在实际使用时存在很多的不便。为了解决这个不足,在设计类时为某些基本数据类型设计了一个对应的类进行代表(Number、String和Boolean),这样和基本数据类型对应的类统称为包装类,然后就可以通过装箱的对象中的属性和行为操作基本数据了。---它们是特殊的引用类型,既与其他的引用类型相似,同时又具有与各自的原始类型相应的特殊行为。比如:
var a="hello"var res=a.substring(0,2)
console.log(res)//"he"
//上面这个例子中,变量a是一个字符串,字符创必然是基本类型的值,但是它却在第二行调用了substring()方法,并将结果返回保存在res中,
// 我们都知道,既然a是基本类型的值而不是对象,因而从逻辑上讲,它是没有方法的。
// 其实在在实现这个操作的时候,内部已经隐式地帮我们帮创建了一个包装对象了,java把这个过程叫做'自动装箱'
// 所以以上的实际的情形应该是这样的:
var a=new String("hello")
var res=a.substring(0,2)
console.log(res)//"he"
在实际运用中,我们可以显式的调用String、Number和Boolean来创建基本包装类型的对象,不过,应该在绝对必要的时候再这么做,因为这种做法很容易让人分不清自己是在处理基本类型还是引用类型。对基本包装类型的实例调用 typeof 会返回object
你好,基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。基本类型有Undefined、Null、Boolean、Number
和String,也就是常用的变量。
栈:特点就是一个先进后出的结构。队列:特点就是一个先进先出的结构。//一般只要你满足这个特点就可以称之为栈或队列。栈的应用:非常广泛,在CPU内部就有提供栈这个机制。主要用途:函数调用和返回,数字转字符,表达式求值,走迷宫等等。在CPU内部栈主要是用来进行子程序调用和返回,中断时数据保存和返回。在编程语言中:主要用来进行函数的调用和返回。可以说在计算机中,只要数据的保存满足先进后出的原理,都优先考虑使用栈,所以栈是计算机中不可缺的机制。队列的应用:队列主要用在和时间有关的地方,特别是操作系统中,队列是实现多任务的重要机制。windows中的消息机制就是通过队列来实现的。进程调度也是使用队列来实现,所以队列也是一个重要的机制。只要满足数据的先进先出原理就可以使用队列。