是否可以在JavaScript中模拟以下代码?
var ref = new Reference();
var arr = [1, 2, ref];
ref.overwrite(3);
console.log(arr); // output: [1,2,3]
此代码将ref
放置在数组中,然后将其覆盖,用3
完全替换它的出现。我们可以通过存储父对象和索引来做类似的事情:
var arr = [1, 2, null];
var ref = {object: arr, index: 2};
ref.object[ref.index] = 3;
console.log(arr); // output: [1, 2, 3]
但这不是同一回事,因为ref
必须跟踪使用它的所有父对象。我有兴趣使用ref
作为占位符,将其存储在多个位置,然后用其他方式替换所有出现的内容,而无需跟踪其使用位置。我们也可以像这样“几乎”做到这一点:
var ref = {value: null};
var arr = [1, 2, ref];
ref.value = 3;
console.log(arr); // output: [1, 2, {value: 3}]
但这并不能完全摆脱包装对象。
答案 0 :(得分:1)
否,JavaScript没有引用或指针作为值。您总是需要一些包装对象(可以根据需要进行更改,但不能替换),因此无法创建自定义基本值。
答案 1 :(得分:1)
无法真正地完成您想做的事情,但是根据您的使用方式,您可以伪造它。您可以使用valueOf返回所需的内容。此处的示例显示了使用它来对数字数组求和,而不是更改并再次运行它。
const sum = arr => arr.reduce((t, i) => t + i, 0)
function MyRef(n) {
this.number = n;
this.overWrite = n => this.number = n
}
MyRef.prototype.valueOf = function() {
return this.number;
};
const ref = new MyRef(100);
const myArray = [1, 2, ref]
console.log(sum(myArray))
ref.overWrite(3)
console.log(sum(myArray))