JavaScript:每次使用'new'变量是重复更改其值的正确方法?

问题描述:

我是新来的javascript & angularjs。我正在使用下面的代码在我的angularjs控制器中将值添加到我的testvalues变量中,该控制器绑定到我的html中的表中。这是正确的方法吗?JavaScript:每次使用'new'变量是重复更改其值的正确方法?

$scope.testvalues = []; 
var testvalue ; 

testvalue = new Object(); 
testvalue["name"] = "xyz"; 
testvalue["size"] = 1024; 
$scope.testvalues.push(testvalue); 

testvalue = new Object(); 
testvalue["name"] = "abc"; 
testvalue["size"] = 2048; 
$scope.testvalues.push(testvalue); 

是否每次都使用new来覆盖现有的内存,或者是否会分配新的内存并取消旧的内存?

+0

我想我明白你的意思,但“提领”指[东西在其他编程(http://stackoverflow.com/q/4955198/5743988) – 4castle

任何时候你使用赋值,旧的引用只会被该单个变量覆盖。所以是的,它分配新的内存,并且你推送的对象将保持不变。

new关键字不是必需的,但用于声明一个对象。由于JavaScript是动态类型的,因此变量声明本身不会分配内存。这一切都是根据需要在飞行中发生的。例如,您可以使用{}而不是new Object()。就像您可以如何使用""而不是new String()[]而不是new Array()function(){}而不是new Function()。总是最好使用语法文字,因为它更短,更快,并且不能被重新定义任何类的人篡改。

你的代码可能是更简单使用数组和对象文字语法:

$scope.testvalues = [{ 
    name: "xyz", 
    size: 1234 
}, { 
    name: "abc", 
    size: 2048 
}]; 
+0

我对你的回答感到惊讶。你是说,即使在数组$ scope.testvalues中有一个对它的引用,javascript也会为testvalue的第一个值释放内存空间吗? –

+0

@BenDadsetan不,我的回答很混乱。我并不是说这些陈述听起来有关。 – 4castle

它分配新的内存,只是rereferences变量。

由于testvalue的值在获取新值之前被推入$scope.testvalues,因此对象{name: 'xyz', size: 1024}将不会被完全引用,并且垃圾收集器不会尝试释放其分配的内存。

新的关键字不可能意味着您认为它在javascript中的含义。获得一些面向对象的世界类行为比与内存分配有关的东西更多。你可能会想看看答案What is the 'new' keyword in JavaScript?

这是正确的方法吗?

关于对象创建你做得很好。

testvalue = new Object(); 
testvalue["name"] = "abc"; 
testvalue["size"] = 2048; 

但是,您可以使用{}来创建一个对象。详细了解差异here

testvalue = { 
    name: "abc", 
    size: 2048 
}; 

如果找到最后一个更容易阅读。

是否每次都使用新的覆盖现有的内存或者是否使用新的内存并提取旧的内存?

那么,这是一个更棘手的问题。我会说你真正要问的是:它允许参考垃圾收集?然后我会说可能不是,但它可能取决于垃圾收集器。

根据MDN关于引用计数垃圾回收(天真的一个)。

如果指向此对象的零引用 被视为垃圾收集对象。

然后我会说,它不会被垃圾收集,因为仍然有第一个对象的引用。请参阅下面的代码片段。数组中有两个对象,因此它们不能被垃圾收集。

var testvalues = []; 
 
var testvalue ; 
 

 
testvalue = new Object(); 
 
testvalue["name"] = "xyz"; 
 
testvalue["size"] = 1024; 
 
testvalues.push(testvalue); 
 

 
testvalue = new Object(); 
 
testvalue["name"] = "abc"; 
 
testvalue["size"] = 2048; 
 
testvalues.push(testvalue); 
 
console.log(testvalues.length); // Will print "2".

所以,当你真的需要释放一些内存,你应该null数组和对象。然而,在现实生活中,除非你有一个非常大的阵列,否则这是很少需要的。

$scope.testvalues = null; 
testvalue = null;