JavaScript:正在使用';新';每次对于一个变量,正确的方法是反复更改其值吗?
我是javascript和angularjs的新手。我使用以下代码向angularjs控制器中的testvalues变量添加值,该变量绑定到html中的一个表。这是正确的方法吗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
$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不,我的回答令人困惑。我不是想让那些陈述听起来有关联。我想我理解你的意思,但“去引用”的意思是