[英]Why do arrays update when variables don't?
查看下面的Java代码显示模块模式,变量“ defaultValue”不会更新,需要使用getter来访问和更新值- 此处说明。
那么为什么数组(例如defaultArray)确实更新并且可以在没有特定getter的情况下进行访问?
示例代码:
var go = function () {
var defaultValue = null;
var defaultArray = [];
var setDefaultValue = function (newObj) {
for (var i = 0; i < 5; i++) {
if (i == 2) {
defaultValue = newObj;
defaultArray.push(newObj);
}
}
};
var getDefault = function () {
return defaultValue;
};
return {
defaultValue: defaultValue,
setDefaultValue: setDefaultValue,
getDefault: getDefault,
defaultArray: defaultArray,
};
};
window.onload = function () {
var ans = new go();
ans.setDefaultValue({ test: 'ok', unos: 123 })
// At this point, defaultArray has updated, but defaultValue has not
var thisWillBeNull = ans.defaultValue;
var thisWillHaveAValue = ans.defaultArray;
// Can get the value
var newDefault = ans.getDefault();
};
区别在于编辑变量本身与引用的对象之间。
将一个变量或属性分配给另一个变量或属性时,始终会复制该值,并且变量/属性保持彼此独立。
// defaultValue: defaultValue
defaultValue ------\
>--- null
ans.defaultValue --/
// defaultArray: defaultArray
defaultArray ------\
>--- []
ans.defaultArray --/
setDefaultValue()
对defaultArray
的重新分配实际上是在更改变量,但对属性没有任何影响。
defaultValue ------- { test: 'ok', unos: 123 }
ans.defaultValue --- null
当.push()
更改Array
实例本身时,变量和属性均保持对Array的引用不变。
defaultArray --------\
>--- [
/ 0: { test: 'ok', unos: 123 }
/ ]
ans.defaultArray --/
通过将属性定义为getter和/或setter ,它将不再拥有自己的值,并将依赖于变量:
return {
get defaultValue() {
return defaultValue;
},
// ...
};
ans.defaultValue ----> defaultValue ----> null
ans.defaultValue ----> defaultValue ----> { test: 'ok', unos: 123 }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.