We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
一个很基础的知识点,JavaScript中基本数据类型和引用数据类型是如何存储的。
由于自己是野生程序员,在刚开始学习程序设计的时候没有在意内存这些基础知识,导致后来在提到“什么什么是存在栈中的,栈中只是存了一个引用”这样的话时总是一脸懵逼。。
后来渐渐的了解了一些内存的知识,这部分还是非常有必要了解的。
栈,只允许在一段进行插入或者删除操作的线性表,是一种先进后出的数据结构。
堆是基于散列算法的数据结构。
队列是一种先进先出(FIFO)的数据结构。
JavaScript中将数据类型分为基本数据类型和引用数据类型,它们其中有一个区别就是存储的位置不同。
我们都知道JavaScript中的基本数据类型有:
基本数据类型都是一些简单的数据段,它们是存储在栈内存中。
JavaScript中的引用数据类型有:
引用数据类型是保存在堆内存中的,然后再栈内存中保存一个对堆内存中实际对象的引用。所以,JavaScript中对引用数据类型的操作都是操作对象的引用而不是实际的对象。
可以理解为,栈内存中保存了一个地址,这个地址和堆内存中的实际值是相关的。
现在,我们声明几个变量试试:
var name="axuebin"; var age=25; var job; var arr=[1,2,3]; var obj={age:25};
可以通过下图来表示数据类型在内存中的存储情况:
此时name,age,job三种基本数据类型是直接存在栈内存中的,而arr,obj在栈内存中只是存了一个地址来表示对堆内存中的引用。
name
age
job
arr
obj
对于基本数据类型,如果进行复制,系统会自动为新的变量在栈内存中分配一个新值,很容易理解。
如果对于数组、对象这样的引用数据类型而言,复制的时候就会有所区别了:
系统也会自动为新的变量在栈内存中分配一个值,但这个值仅仅是一个地址。也就是说,复制出来的变量和原有的变量具有相同的地址值,指向堆内存中的同一个对象。
如果所示,执行了var objCopy=obj之后,obj和objCopy具有相同的地址值,执行堆内存中的同一个实际对象。
var objCopy=obj
objCopy
这有什么不同呢?
当我修改obj或objCopy时,都会引起另一个变量的改变。
为什么基础数据类型存在栈中,而引用数据类型存在堆中呢?
http://www.jianshu.com/p/996671d4dcc4 http://blog.sina.com.cn/s/blog_8ecde0fe0102vy6e.html
The text was updated successfully, but these errors were encountered:
No branches or pull requests
一个很基础的知识点,JavaScript中基本数据类型和引用数据类型是如何存储的。
由于自己是野生程序员,在刚开始学习程序设计的时候没有在意内存这些基础知识,导致后来在提到“什么什么是存在栈中的,栈中只是存了一个引用”这样的话时总是一脸懵逼。。
后来渐渐的了解了一些内存的知识,这部分还是非常有必要了解的。
基本数据结构
栈
堆
队列
JavaScript中数据类型的存储
JavaScript中将数据类型分为基本数据类型和引用数据类型,它们其中有一个区别就是存储的位置不同。
基本数据类型
我们都知道JavaScript中的基本数据类型有:
基本数据类型都是一些简单的数据段,它们是存储在栈内存中。
引用数据类型
JavaScript中的引用数据类型有:
引用数据类型是保存在堆内存中的,然后再栈内存中保存一个对堆内存中实际对象的引用。所以,JavaScript中对引用数据类型的操作都是操作对象的引用而不是实际的对象。
可以理解为,栈内存中保存了一个地址,这个地址和堆内存中的实际值是相关的。
图解
现在,我们声明几个变量试试:
可以通过下图来表示数据类型在内存中的存储情况:
此时
name
,age
,job
三种基本数据类型是直接存在栈内存中的,而arr
,obj
在栈内存中只是存了一个地址来表示对堆内存中的引用。复制
基本数据类型
对于基本数据类型,如果进行复制,系统会自动为新的变量在栈内存中分配一个新值,很容易理解。
引用数据类型
如果对于数组、对象这样的引用数据类型而言,复制的时候就会有所区别了:
系统也会自动为新的变量在栈内存中分配一个值,但这个值仅仅是一个地址。也就是说,复制出来的变量和原有的变量具有相同的地址值,指向堆内存中的同一个对象。
如果所示,执行了
var objCopy=obj
之后,obj
和objCopy
具有相同的地址值,执行堆内存中的同一个实际对象。这有什么不同呢?
当我修改
obj
或objCopy
时,都会引起另一个变量的改变。为什么?
为什么基础数据类型存在栈中,而引用数据类型存在堆中呢?
参考文章
http://www.jianshu.com/p/996671d4dcc4
http://blog.sina.com.cn/s/blog_8ecde0fe0102vy6e.html
The text was updated successfully, but these errors were encountered: