JavaScript:正在使用';新';每次对于一个变量,正确的方法是反复更改其值吗?

JavaScript:正在使用';新';每次对于一个变量,正确的方法是反复更改其值吗?,javascript,angularjs,Javascript,Angularjs,我是javascript和angularjs的新手。我使用以下代码向angularjs控制器中的testvalues变量添加值,该变量绑定到html中的一个表。这是正确的方法吗 $scope.testvalues = []; var testvalue ; testvalue = new Object(); testvalue["name"] = "xyz"; testvalue["size"] = 1024; $scope.testvalues.push(testvalue); testv

我是javascript和angularjs的新手。我使用以下代码向angularjs控制器中的testvalues变量添加值,该变量绑定到html中的一个表。这是正确的方法吗

$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是覆盖现有内存还是分配新内存并取消对旧内存的引用?

每次使用assignment时,旧引用只会覆盖该单个变量。所以是的,它分配了新的内存,你推的对象将保持不变

虽然声明对象时不需要使用
new
关键字。因为JavaScript是动态类型化的,所以变量声明本身不做任何分配内存的事情。这一切都是在需要的时候进行的。例如,您可以使用
{}
而不是
新对象()
。就像您如何使用
而不是
新字符串()
,或
[]
而不是
新数组()
,或
函数(){}
而不是
新函数()
。最好使用语法文本,因为它更短、更快,并且不能被重新定义任何类的人篡改

使用数组和对象文字语法,您的代码可能会简单得多:

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

它分配新内存,只需重新引用变量

由于testvalue的值在获得新值之前被推送到
$scope.testvalues
上,因此对象
{name:'xyz',size:1024}
不会完全延迟,垃圾收集器也不会尝试释放其分配的内存

新的关键字不太可能是您认为它在javascript中的意思。与其说它与内存分配有关,不如说它更像是一系列面向对象的类似世界的行为。你可能会想看看答案

这是正确的方法吗

$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);
关于对象创建,您做得很好

testvalue = new Object();
testvalue["name"] = "abc";
testvalue["size"] = 2048;
但是您可以使用
{}
创建对象。了解更多关于差异的信息

如果发现最后一个更容易阅读

每次使用“新建”都会覆盖现有内存还是会覆盖现有内存 分配新内存并取消对旧内存的引用

嗯,这是一个更棘手的问题。我想说你真正想问的是:它允许引用被垃圾收集吗?然后我会说可能不会,但这可能取决于垃圾收集器

根据关于参考计数垃圾收集的(天真的一个)

如果没有引用,则认为对象是可垃圾回收的 指向这个物体

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

var testvalues=[];
var测试值;
testvalue=新对象();
测试值[“名称”]=“xyz”;
testvalue[“大小”]=1024;
push(testvalue);
testvalue=新对象();
测试值[“名称”]=“abc”;
测试值[“大小”]=2048;
push(testvalue);

console.log(testvalues.length);//将打印“2”。
我对你的答案感到惊讶。你是说javascript将为testvalue的第一个值释放内存,即使在数组$scope.testvalues中有对它的引用?@BenDadsetan不,我的回答令人困惑。我不是想让那些陈述听起来有关联。我想我理解你的意思,但“去引用”的意思是