在FORTRAN和C ++中,特定数组元素的地址可以传递给函数。例如,在主例程中, WA1 是大小为25的工作数组, offset 是一个整数变量,表示与0索引的偏移量。说偏移目前是6。
子例程的声明可能如下所示:
void Array_Manip1(double* WorkArray1){
. . .
在主程序中调用子程序时,调用可能如下所示:
Array_Manip1(&WA1[offset]);
通过这样做,我可以在0-index开始的子例程中索引 WorkArray1 ,但知道它实际上是WA1 [6]。
e.g。 -
for (int i = 0; i < 19; ++i)
WorkArray1[i] = whatever computation is required.
要在Javascript中执行此操作,我认为可以将完整数组传递给子例程,再加上一个变量来保存偏移量。然后在子例程中,必须将偏移量添加到数组索引值中。
即G。 -
for (int i = 0; i < 19; ++i){
WorkArray1[offset + i] = whatever computation is required.
但是现在我又将一个变量传递给子例程,每次循环时都必须将偏移量添加到数组索引中。
在Javascript中有更好的方法吗? 有没有办法模仿C ++将特定数组元素的地址传递给函数的能力?
答案 0 :(得分:1)
最干净的方法是拼接数组并从当前索引传入子数组。这样你仍然有一个参考,一切都保持清洁。
但不是,大多数高级语言中的数组不允许引用单个元素然后返回到数组。由于某些原因,基础数据甚至可能无法连续存储,因此存在危险。 JavaScript也不例外,你可以传入一个数组和一个索引,或者一个子数组,但你不能传入对数组中元素的引用,并在传入后返回数组。
答案 1 :(得分:0)
答案 2 :(得分:0)
你可以做你想做的事。事实上,有时javascript只能 做你想做的事。这完全取决于数组包含的数据。
在Javascript中,变量的内容可以是值或引用(指针但没有指针算术)。但是你没有选择。数字和字符串总是值(有异常,但在作为函数参数传递时不适用),其他所有内容都是引用。
因此,要获得所需的行为,只需使用对象或数组作为值的持有者而不是字符串或数字:
var ref_array = [ {value:1}, {value:2}, {value:3} ];
function increment (v_obj) {
v_obj.value ++;
}
var ref = ref_array[1];
increment(ref);
// ref_array will now contain: [{value:1},{value:3},{value:3}]
虽然不是那么简单。虽然对象似乎是通过引用传递的,但是在调用函数时会复制引用。这意味着ref
和ref_array[1]
以及v_obj
是指向同一事物的三个独立变量。
例如,这不起作用:
function replace (obj1, obj2) {
obj1 = obj2;
}
replace(ref_array[1], {value:9});
// ref_array is still: [{value:1},{value:3},{value:3}]
这是因为,虽然上面函数中的obj1
指向与ref_array[1]
相同的对象,但它实际上并不是指向ref_array[1]
的指针,而是一个单独的变量。在C中,这就像obj1 = &ref_array[1]
。因此,传递参数会传递指针的副本,但不传递指针本身。