Javascript 获取对数组元素的引用
虽然我意识到数组作为非基本数据类型是由JavaScript中的引用处理的,而不是由值处理的,但该数组的任何特定元素都可以是基本数据类型,我假设它不是由引用分配的 我想知道如何获取对数组中单个元素的引用,以便在更改该元素时不必一直引用数组和索引号 i、 e 我是否误解了暗示但未明确声明这不是预期行为的各种行为?您可以复制数组元素,但不能创建用作数组属性引用别名的值。对象属性也是如此;当然,数组元素引用是对象属性引用 最接近的方法是使用setter创建一个对象,setter使用代码更新数组。这看起来像:Javascript 获取对数组元素的引用,javascript,Javascript,虽然我意识到数组作为非基本数据类型是由JavaScript中的引用处理的,而不是由值处理的,但该数组的任何特定元素都可以是基本数据类型,我假设它不是由引用分配的 我想知道如何获取对数组中单个元素的引用,以便在更改该元素时不必一直引用数组和索引号 i、 e 我是否误解了暗示但未明确声明这不是预期行为的各种行为?您可以复制数组元素,但不能创建用作数组属性引用别名的值。对象属性也是如此;当然,数组元素引用是对象属性引用 最接近的方法是使用setter创建一个对象,setter使用代码更新数组。这看起来
var someArray = [ ... whatever ... ];
var obj = {
set element5(value) {
someArray[5] = value;
}
};
然后:
将更新someArray[5]
。与someArray[5]=20相比,这显然不是一个真正的改进
编辑-现在,请注意,如果您的数组元素是一个对象,那么复制该元素意味着复制对该对象的引用。因此:
var someArray = [ { foo: "hello world" } ];
var ref = someArray[0];
然后:
将更新由someArray[0]
引用的对象的“foo”属性。您可以创建数组元素的副本,但不能创建用作数组属性引用别名的值。对象属性也是如此;当然,数组元素引用是对象属性引用
最接近的方法是使用setter创建一个对象,setter使用代码更新数组。这看起来像:
var someArray = [ ... whatever ... ];
var obj = {
set element5(value) {
someArray[5] = value;
}
};
然后:
将更新someArray[5]
。与someArray[5]=20相比,这显然不是一个真正的改进
编辑-现在,请注意,如果您的数组元素是一个对象,那么复制该元素意味着复制对该对象的引用。因此:
var someArray = [ { foo: "hello world" } ];
var ref = someArray[0];
然后:
将更新由someArray[0]
引用的对象的“foo”属性。您可以创建数组元素的副本,但不能创建用作数组属性引用别名的值。对象属性也是如此;当然,数组元素引用是对象属性引用
最接近的方法是使用setter创建一个对象,setter使用代码更新数组。这看起来像:
var someArray = [ ... whatever ... ];
var obj = {
set element5(value) {
someArray[5] = value;
}
};
然后:
将更新someArray[5]
。与someArray[5]=20相比,这显然不是一个真正的改进
编辑-现在,请注意,如果您的数组元素是一个对象,那么复制该元素意味着复制对该对象的引用。因此:
var someArray = [ { foo: "hello world" } ];
var ref = someArray[0];
然后:
将更新由someArray[0]
引用的对象的“foo”属性。您可以创建数组元素的副本,但不能创建用作数组属性引用别名的值。对象属性也是如此;当然,数组元素引用是对象属性引用
最接近的方法是使用setter创建一个对象,setter使用代码更新数组。这看起来像:
var someArray = [ ... whatever ... ];
var obj = {
set element5(value) {
someArray[5] = value;
}
};
然后:
将更新someArray[5]
。与someArray[5]=20相比,这显然不是一个真正的改进
编辑-现在,请注意,如果您的数组元素是一个对象,那么复制该元素意味着复制对该对象的引用。因此:
var someArray = [ { foo: "hello world" } ];
var ref = someArray[0];
然后:
将更新由someArray[0]
引用的对象的“foo”属性。您始终可以传递一个闭包来更新此属性:
var myUpdater = function(x) {
someArray[4] = x;
}
myUpdater(5);
如果您需要读/写功能,请选择:
var makeBox = function(arr, n) {
return {
read: function() { return arr[n]; },
write: function(x) { arr[n] = x; }
};
}
// and then:
var ptr = makeBox(someArray, 4);
ptr.read(); // original
ptr.write(newValue);
someArray[4]; // newValue
您始终可以传递一个闭包来更新此闭包:
var myUpdater = function(x) {
someArray[4] = x;
}
myUpdater(5);
如果您需要读/写功能,请选择:
var makeBox = function(arr, n) {
return {
read: function() { return arr[n]; },
write: function(x) { arr[n] = x; }
};
}
// and then:
var ptr = makeBox(someArray, 4);
ptr.read(); // original
ptr.write(newValue);
someArray[4]; // newValue
您始终可以传递一个闭包来更新此闭包:
var myUpdater = function(x) {
someArray[4] = x;
}
myUpdater(5);
如果您需要读/写功能,请选择:
var makeBox = function(arr, n) {
return {
read: function() { return arr[n]; },
write: function(x) { arr[n] = x; }
};
}
// and then:
var ptr = makeBox(someArray, 4);
ptr.read(); // original
ptr.write(newValue);
someArray[4]; // newValue
您始终可以传递一个闭包来更新此闭包:
var myUpdater = function(x) {
someArray[4] = x;
}
myUpdater(5);
如果您需要读/写功能,请选择:
var makeBox = function(arr, n) {
return {
read: function() { return arr[n]; },
write: function(x) { arr[n] = x; }
};
}
// and then:
var ptr = makeBox(someArray, 4);
ptr.read(); // original
ptr.write(newValue);
someArray[4]; // newValue
因此,每当我想更改数组的元素时,我必须使用索引语法完整、显式地访问该元素。例如,如果您想执行someArray[4].prop=4;someArray[4].foo=6
etc,您必须每次索引到数组中,如果您连续执行许多操作,程序必须每次查找索引如果数组元素是一个对象,那么复制它将为您省去这一麻烦。我将扩展答案。由于您试图在someArray[4]
上设置属性,因此这似乎是一个非原语。在这种情况下,您可以保存对someArray[4]
的引用并使用它。但就保存对原语的引用而言,如果没有像上述答案那样的某种形式的装箱,就无法做到这一点。因此,每当我想更改数组的元素时,我必须使用索引语法完整、显式地访问该元素。例如,如果您想执行someArray[4].prop=4;someArray[4].foo=6
etc,您必须每次索引到数组中,如果您连续执行许多操作,程序必须每次查找索引如果数组元素是一个对象,那么复制它将为您省去这一麻烦。我将扩展答案。由于您试图在someArray[4]
上设置属性,因此这似乎是一个非原语。在这种情况下,您可以保存对someArray[4]
的引用并使用它。但就保存对原语的引用而言,如果没有像上述答案那样的某种形式的装箱,就无法做到这一点。因此,每当我想更改数组的元素时,我必须使用索引语法完整、显式地访问该元素。例如,如果您想执行someArray[4].pro,这似乎是浪费