关于js中内存分配的一些疑惑

时间:2021-08-27 18:51:00

var a=10;
var b={name:"js"};

上面两个变量:
根据我看得资料,按我的理解就是a在栈上分配一个区域存在10这个值。b在堆上分配一个区域存储对象,然后将堆上的地址赋值给栈上。
如果我理解没有什么问题,那么请问【a】【b】本身这种变量名是存在什么地方了,变量名又是怎么和栈上的值或地址相关联的呢?如果我哪里理解有误,还请不吝赐教.

14 个解决方案

#1


首先注意一点:js是解释形语言!

声明a的时候解释器会开辟一块内存,存储变量名a和变量值!

至于解释器如何存储才是你说的问题!

#2


引用 1 楼 jiangbai333 的回复:
首先注意一点:js是解释形语言!

声明a的时候解释器会开辟一块内存,存储变量名a和变量值!

至于解释器如何存储才是你说的问题!

首先感谢您的回答。
恕我愚钝,不明白您为什么要提醒我主要js是解释型语言,我上面提的哪里显得是编译型语言?
您的意思是变量名会和变量的值一起存储,存储在一个连续的内存地址里?我觉得这和我看到的所有文章但不符合。都是只提到在栈中分配变量的值,从没提到变量本身的存储。我的理解是,是不是在内存中另开一片区域,用来存储变量变量名和变量名对应的栈地址?

#3


引用 2 楼 Lloooong 的回复:
Quote: 引用 1 楼 jiangbai333 的回复:

首先注意一点:js是解释形语言!

声明a的时候解释器会开辟一块内存,存储变量名a和变量值!

至于解释器如何存储才是你说的问题!

首先感谢您的回答。
恕我愚钝,不明白您为什么要提醒我主要js是解释型语言,我上面提的哪里显得是编译型语言?
您的意思是变量名会和变量的值一起存储,存储在一个连续的内存地址里?我觉得这和我看到的所有文章但不符合。都是只提到在栈中分配变量的值,从没提到变量本身的存储。我的理解是,是不是在内存中另开一片区域,用来存储变量变量名和变量名对应的栈地址?

堆和栈差别大么?
对象都放在堆里么?

#4


首先,堆和栈都是编译型语言中的概念
js 是解释型语言,没有这个玩意
所以你没有看到 js 有 pop、push 这样的栈操作函数,也没有看到 malloc 这样的堆操作函数

解释型语言都维护着一张表,或者你可理解为一个结构数组
记录着每个变量的名字、类型、值

#5


如果是javaScript中的基本数据类型定义,只要用栈内存就可以,不用堆内存。
如果是引用类型,除了要栈内存外,还需要有堆内存空间地址。不管是基本类型,还是引用类型,栈内存都是需要的,如果是基本数据类型,则栈中存储的就是值,如果是引用数据类型,则栈中存的是地址值,这个地址值是堆内存中的,这个堆内存中存储了引用类型的具体值。

#6


引用 4 楼 xuzuning 的回复:
首先,堆和栈都是编译型语言中的概念
js 是解释型语言,没有这个玩意
所以你没有看到 js 有 pop、push 这样的栈操作函数,也没有看到 malloc 这样的堆操作函数

解释型语言都维护着一张表,或者你可理解为一个结构数组
记录着每个变量的名字、类型、值

我知道我是知道的太少,想得太多。妄想不用翻看大块头的书,看几篇博客,提几个问题就能对js有个深刻的印象,显然是不靠谱的。谢谢版主的回复,你说的解释性语言没有栈和堆的概念,这点存疑。毕竟我看到太多说到js里面栈和堆的文章。比如你的楼下。

#7


引用 5 楼 licip 的回复:
如果是javaScript中的基本数据类型定义,只要用栈内存就可以,不用堆内存。
如果是引用类型,除了要栈内存外,还需要有堆内存空间地址。不管是基本类型,还是引用类型,栈内存都是需要的,如果是基本数据类型,则栈中存储的就是值,如果是引用数据类型,则栈中存的是地址值,这个地址值是堆内存中的,这个堆内存中存储了引用类型的具体值。

首先感谢您的回答。不过十分遗憾,您并未能仔细看明白我问的内容。建议看上版主的回答,和版主PK下。

#8


其实我就是想大致的不用十分精确的了解javascript各个部分在物理内存的存储位置和方式。包括值类型,引用类型,变量名乃至函数等等所有的东西。

#9


引用 4 楼 xuzuning 的回复:
首先,堆和栈都是编译型语言中的概念
js 是解释型语言,没有这个玩意
所以你没有看到 js 有 pop、push 这样的栈操作函数,也没有看到 malloc 这样的堆操作函数

解释型语言都维护着一张表,或者你可理解为一个结构数组
记录着每个变量的名字、类型、值


解释型语言需要用到编译器么。

#10


引用 7 楼 Lloooong 的回复:
Quote: 引用 5 楼 licip 的回复:

如果是javaScript中的基本数据类型定义,只要用栈内存就可以,不用堆内存。
如果是引用类型,除了要栈内存外,还需要有堆内存空间地址。不管是基本类型,还是引用类型,栈内存都是需要的,如果是基本数据类型,则栈中存储的就是值,如果是引用数据类型,则栈中存的是地址值,这个地址值是堆内存中的,这个堆内存中存储了引用类型的具体值。

首先感谢您的回答。不过十分遗憾,您并未能仔细看明白我问的内容。建议看上版主的回答,和版主PK下。
pk说不上,在我看的很多书与资料中,是这样说的,也许我也书误导说不定。但我还是认为javaScript也是有堆内存的。

#11


init global;
init global.window;
init global.window.a;
init global.window.a ==> int(32/64);
init global.window.b;
init global.window.0x0000F ==> 0x0002;
init 0x0002 ==> 0x0003;
init 0x0003 ==> [0x0004 go 0x0005];
init 0x0004 ==> char[L];
init 0x0005 ==> char[L];
init global.window.b ==> global.window.0x0000F;
ret global.window;

#12


javascript only heap, not have stacks.

#13


我前段时间和博主有相同的困惑,我搜了一些资料,说变量名只是一个占位符,当你操作变量的时候,其实直接 是操作内存中的值或地址(不是很理解,需要看编译原理)
如果是javaScript中的基本数据类型定义,只要用栈内存就可以,不用堆内存。
如果是引用类型,除了要栈内存外,还需要有堆内存空间地址。不管是基本类型,还是引用类型,栈内存都是需要的,如果是基本数据类型,则栈中存储的就是值,如果是引用数据类型,则栈中存的是地址值,这个地址值是堆内存中的,这个堆内存中存储了引用类型的具体值。
var name = 'Kobe'; var b = {'name': 'Kobe'};
name == b.name //true
name === b.name  //true
这就说明,name和b.name其实都是栈内存中完全相同的一个地址的引用
如果实在不能理解,我觉得可以简单的认为在栈内存中有一块地址是用来映射变量名和变量值的关系

#14


var j = 'jQuery';
window[j].xxxxx;
为什么能访问呢?
直接可以推论必定有一个变量地址的映射表

#1


首先注意一点:js是解释形语言!

声明a的时候解释器会开辟一块内存,存储变量名a和变量值!

至于解释器如何存储才是你说的问题!

#2


引用 1 楼 jiangbai333 的回复:
首先注意一点:js是解释形语言!

声明a的时候解释器会开辟一块内存,存储变量名a和变量值!

至于解释器如何存储才是你说的问题!

首先感谢您的回答。
恕我愚钝,不明白您为什么要提醒我主要js是解释型语言,我上面提的哪里显得是编译型语言?
您的意思是变量名会和变量的值一起存储,存储在一个连续的内存地址里?我觉得这和我看到的所有文章但不符合。都是只提到在栈中分配变量的值,从没提到变量本身的存储。我的理解是,是不是在内存中另开一片区域,用来存储变量变量名和变量名对应的栈地址?

#3


引用 2 楼 Lloooong 的回复:
Quote: 引用 1 楼 jiangbai333 的回复:

首先注意一点:js是解释形语言!

声明a的时候解释器会开辟一块内存,存储变量名a和变量值!

至于解释器如何存储才是你说的问题!

首先感谢您的回答。
恕我愚钝,不明白您为什么要提醒我主要js是解释型语言,我上面提的哪里显得是编译型语言?
您的意思是变量名会和变量的值一起存储,存储在一个连续的内存地址里?我觉得这和我看到的所有文章但不符合。都是只提到在栈中分配变量的值,从没提到变量本身的存储。我的理解是,是不是在内存中另开一片区域,用来存储变量变量名和变量名对应的栈地址?

堆和栈差别大么?
对象都放在堆里么?

#4


首先,堆和栈都是编译型语言中的概念
js 是解释型语言,没有这个玩意
所以你没有看到 js 有 pop、push 这样的栈操作函数,也没有看到 malloc 这样的堆操作函数

解释型语言都维护着一张表,或者你可理解为一个结构数组
记录着每个变量的名字、类型、值

#5


如果是javaScript中的基本数据类型定义,只要用栈内存就可以,不用堆内存。
如果是引用类型,除了要栈内存外,还需要有堆内存空间地址。不管是基本类型,还是引用类型,栈内存都是需要的,如果是基本数据类型,则栈中存储的就是值,如果是引用数据类型,则栈中存的是地址值,这个地址值是堆内存中的,这个堆内存中存储了引用类型的具体值。

#6


引用 4 楼 xuzuning 的回复:
首先,堆和栈都是编译型语言中的概念
js 是解释型语言,没有这个玩意
所以你没有看到 js 有 pop、push 这样的栈操作函数,也没有看到 malloc 这样的堆操作函数

解释型语言都维护着一张表,或者你可理解为一个结构数组
记录着每个变量的名字、类型、值

我知道我是知道的太少,想得太多。妄想不用翻看大块头的书,看几篇博客,提几个问题就能对js有个深刻的印象,显然是不靠谱的。谢谢版主的回复,你说的解释性语言没有栈和堆的概念,这点存疑。毕竟我看到太多说到js里面栈和堆的文章。比如你的楼下。

#7


引用 5 楼 licip 的回复:
如果是javaScript中的基本数据类型定义,只要用栈内存就可以,不用堆内存。
如果是引用类型,除了要栈内存外,还需要有堆内存空间地址。不管是基本类型,还是引用类型,栈内存都是需要的,如果是基本数据类型,则栈中存储的就是值,如果是引用数据类型,则栈中存的是地址值,这个地址值是堆内存中的,这个堆内存中存储了引用类型的具体值。

首先感谢您的回答。不过十分遗憾,您并未能仔细看明白我问的内容。建议看上版主的回答,和版主PK下。

#8


其实我就是想大致的不用十分精确的了解javascript各个部分在物理内存的存储位置和方式。包括值类型,引用类型,变量名乃至函数等等所有的东西。

#9


引用 4 楼 xuzuning 的回复:
首先,堆和栈都是编译型语言中的概念
js 是解释型语言,没有这个玩意
所以你没有看到 js 有 pop、push 这样的栈操作函数,也没有看到 malloc 这样的堆操作函数

解释型语言都维护着一张表,或者你可理解为一个结构数组
记录着每个变量的名字、类型、值


解释型语言需要用到编译器么。

#10


引用 7 楼 Lloooong 的回复:
Quote: 引用 5 楼 licip 的回复:

如果是javaScript中的基本数据类型定义,只要用栈内存就可以,不用堆内存。
如果是引用类型,除了要栈内存外,还需要有堆内存空间地址。不管是基本类型,还是引用类型,栈内存都是需要的,如果是基本数据类型,则栈中存储的就是值,如果是引用数据类型,则栈中存的是地址值,这个地址值是堆内存中的,这个堆内存中存储了引用类型的具体值。

首先感谢您的回答。不过十分遗憾,您并未能仔细看明白我问的内容。建议看上版主的回答,和版主PK下。
pk说不上,在我看的很多书与资料中,是这样说的,也许我也书误导说不定。但我还是认为javaScript也是有堆内存的。

#11


init global;
init global.window;
init global.window.a;
init global.window.a ==> int(32/64);
init global.window.b;
init global.window.0x0000F ==> 0x0002;
init 0x0002 ==> 0x0003;
init 0x0003 ==> [0x0004 go 0x0005];
init 0x0004 ==> char[L];
init 0x0005 ==> char[L];
init global.window.b ==> global.window.0x0000F;
ret global.window;

#12


javascript only heap, not have stacks.

#13


我前段时间和博主有相同的困惑,我搜了一些资料,说变量名只是一个占位符,当你操作变量的时候,其实直接 是操作内存中的值或地址(不是很理解,需要看编译原理)
如果是javaScript中的基本数据类型定义,只要用栈内存就可以,不用堆内存。
如果是引用类型,除了要栈内存外,还需要有堆内存空间地址。不管是基本类型,还是引用类型,栈内存都是需要的,如果是基本数据类型,则栈中存储的就是值,如果是引用数据类型,则栈中存的是地址值,这个地址值是堆内存中的,这个堆内存中存储了引用类型的具体值。
var name = 'Kobe'; var b = {'name': 'Kobe'};
name == b.name //true
name === b.name  //true
这就说明,name和b.name其实都是栈内存中完全相同的一个地址的引用
如果实在不能理解,我觉得可以简单的认为在栈内存中有一块地址是用来映射变量名和变量值的关系

#14


var j = 'jQuery';
window[j].xxxxx;
为什么能访问呢?
直接可以推论必定有一个变量地址的映射表