是否可以在JavaScript中“覆盖指针”?

时间:2019-01-23 18:45:37

标签: javascript

是否可以在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}]

但这并不能完全摆脱包装对象。

2 个答案:

答案 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))

相关问题