Javascript:将数组元素的地址传递给函数

时间:2015-03-26 03:14:12

标签: javascript arrays function pointers

在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 ++将特定数组元素的地址传递给函数的能力?

3 个答案:

答案 0 :(得分:1)

最干净的方法是拼接数组并从当前索引传入子数组。这样你仍然有一个参考,一切都保持清洁。

但不是,大多数高级语言中的数组不允许引用单个元素然后返回到数组。由于某些原因,基础数据甚至可能无法连续存储,因此存在危险。 JavaScript也不例外,你可以传入一个数组和一个索引,或者一个子数组,但你不能传入对数组中元素的引用,并在传入后返回数组。

答案 1 :(得分:0)

蒂姆的回答是正确的。我只是想添加一些类似C的typed arrays:它们可以作为ArrayBuffer的视图创建,在这种情况下,您可以创建与较大数组相同的缓冲区的新视图,但从偏移量开始,并传递,而不复制基础数据。最近的,你可以找到你的指针。

答案 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}]

虽然不是那么简单。虽然对象似乎是通过引用传递的,但是在调用函数时会复制引用。这意味着refref_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]。因此,传递参数会传递指针的副本,但不传递指针本身。