JavaScript中的内存问题

| 每次实例化对象或函数时,它都会存储内存还是仅仅是存储了原始值的变量。 例如-
var myArray = new Array();
var num = function(){};
    
已邀请:
当你做
var myArray = new Array();
您在内存中创建一个对象,并将对该对象的引用存储在变量“ 3”中。 (引用就像C / C ++中的指针。它是一个值,它告诉JavaScript引擎对象在哪里。)例如: +--------+ | myArray | +-------+ +---------+ | ref | ---------->数组的实例| +-------+ +---------+                       |长度= 0 |                       +--------------+ 当您这样做时:
var n = 2;
您将实际值2存储在
n
中: +--------+ | n | +--------+ | 2 | +--------+ 这是基本类型和对象类型之间的本质区别。 (它有些模糊了字符串,但是您可以假装JavaScript中的原始字符串的作用就像数字一样,这样引擎就会向您隐藏一些细节。) 这是一个重要的区别,因为JavaScript是一种纯粹的按值传递语言,因此,当您调用一个函数并将参数传递给该函数时,将传递值而不是变量。考虑:
function foo(index, a) {
    return a[index];
}
foo
函数接受一个索引和一个数组,并在该索引处返回数组中元素的值。
x = foo(n, myArray);
调用
foo
函数,并传入
n
(2)的值和
myArray
的值(对数组的引用)。因此,
index
接收相同的值
n
具有(2),而
a
接收相同的值
myArray
具有(对数组的引用)。由于
a
myArray
的值是对数组的引用,因此它们都引用同一数组: +--------+ | myArray | +--------+ | ref | ------- + +---------+ |                   | +-------------+ +-------+ +->数组的实例| |一个| | +--------------+ +---------+ | |长度= 0 | | ref | −−−−−− + + −−−−−−−−−−−− +--------+ +--------+ | n | +--------+ | 2 | +--------+ +--------+ |索引| +--------+ | 2 | +--------+ 赋值语句也是如此,原因相同:
=
左侧的变量接收其右侧表达式的值。
var n2 = n;
var a2 = myArray;
n2
接收
n
(2)的值,
a2
接收
myArray
的值(对数组的引用)。如果我们用图表表示
myArray
a2
n
n2
,则该图将与上面关于
foo
的自变量
index
a
的图相同。 由于
myArray
a
指向相同的数组(引用相同的对象),因此,如果它们对数组执行mutator操作,则可以通过两个引用看到结果。例如,向数组添加一个新元素是一个mutator操作,它将在适当的位置更改对象:
alert(myArray.length); // 0
alert(a.length);       // 0
a.push(\"test\");
alert(myArray.length); // 1
alert(a.length);       // 1
了解那里发生的事情很重要。变量
myArray
a
未更改,但它们所引用的对象已更改。相反:
a = someOtherArray;
现在
a
完全指向其他地方,它的值不再与
myArray
的值相同,因此它不再指向同一对象。 离题:更好的写作方式
var myArray = new Array();
var myArray = [];
最终结果是相同的(创建了一个新数组并将其分配给
myArray
),但是第二个数组更短,效率更高,并且可以保证您得到一个数组(而在异常情况下,第一个数组可以,不要给您一个数组-如果有人用阴影标记了“ 42”符号)。 同样,您可以编写
var obj = new Object();
像这样
var obj = {};
...由于相同的原因而具有类似的好处。     
        每条数据都存储在内存中。当实例化对象时,对象引用存储在变量中。使用基本类型时,实际值存储在变量中。     
变量是一块内存。您可以放入数据的所有内容(包括函数)都将使用内存。没有内存,您将无法运行或使用之前声明的内容,因为您会忘记它。 我倾向于认为使用了多少内存以及具体如何实现的细节,这就是为什么我们看到许多不同的性能比较的原因。由于V8和Rhino是分别在Chrome和Firefox中使用的Java解释器的开源实现,因此如果要了解具体信息,请检查它们。     

要回复问题请先登录注册