JavaScript中的内存问题
|
每次实例化对象或函数时,它都会存储内存还是仅仅是存储了原始值的变量。
例如-
var myArray = new Array();
或var num = function(){};
没有找到相关结果
已邀请:
3 个回复
芜任亮蜡
您在内存中创建一个对象,并将对该对象的引用存储在变量“ 3”中。 (引用就像C / C ++中的指针。它是一个值,它告诉JavaScript引擎对象在哪里。)例如: +--------+ | myArray | +-------+ +---------+ | ref | ---------->数组的实例| +-------+ +---------+ |长度= 0 | +--------------+ 当您这样做时:
您将实际值2存储在
中: +--------+ | n | +--------+ | 2 | +--------+ 这是基本类型和对象类型之间的本质区别。 (它有些模糊了字符串,但是您可以假装JavaScript中的原始字符串的作用就像数字一样,这样引擎就会向您隐藏一些细节。) 这是一个重要的区别,因为JavaScript是一种纯粹的按值传递语言,因此,当您调用一个函数并将参数传递给该函数时,将传递值而不是变量。考虑:
函数接受一个索引和一个数组,并在该索引处返回数组中元素的值。
调用
函数,并传入
(2)的值和
的值(对数组的引用)。因此,
接收相同的值
具有(2),而
接收相同的值
具有(对数组的引用)。由于
和
的值是对数组的引用,因此它们都引用同一数组: +--------+ | myArray | +--------+ | ref | ------- + +---------+ | | +-------------+ +-------+ +->数组的实例| |一个| | +--------------+ +---------+ | |长度= 0 | | ref | −−−−−− + + −−−−−−−−−−−− +--------+ +--------+ | n | +--------+ | 2 | +--------+ +--------+ |索引| +--------+ | 2 | +--------+ 赋值语句也是如此,原因相同:
左侧的变量接收其右侧表达式的值。
接收
(2)的值,
接收
的值(对数组的引用)。如果我们用图表表示
,
,
和
,则该图将与上面关于
的自变量
和
的图相同。 由于
和
指向相同的数组(引用相同的对象),因此,如果它们对数组执行mutator操作,则可以通过两个引用看到结果。例如,向数组添加一个新元素是一个mutator操作,它将在适当的位置更改对象:
了解那里发生的事情很重要。变量
和
未更改,但它们所引用的对象已更改。相反:
现在
完全指向其他地方,它的值不再与
的值相同,因此它不再指向同一对象。 离题:更好的写作方式
是
最终结果是相同的(创建了一个新数组并将其分配给
),但是第二个数组更短,效率更高,并且可以保证您得到一个数组(而在异常情况下,第一个数组可以,不要给您一个数组-如果有人用阴影标记了“ 42”符号)。 同样,您可以编写
像这样
...由于相同的原因而具有类似的好处。
撵穆
纫合峭