2015-03-26 3 views
0

В FORTRAN и C++ адрес определенного элемента массива может быть передан в функцию. Например, в основной подпрограмме WA1 представляет собой рабочий массив размером 25 и offset - целочисленная переменная, которая указывает смещение от 0-индекса. Скажем смещение в настоящее время 6.Javascript: Передача адреса элемента массива в функцию

Декларация подпрограммы может выглядеть следующим образом:

void Array_Manip1(double* WorkArray1){ 
. . . 

Когда подпрограмма вызывается в основной программе, вызов может выглядеть следующим образом :

Array_Manip1(&WA1[offset]); 

делая это, я могу индекс WorkArray1 в подпрограмму, начиная с 0-индекса, но зная, что это на самом деле WA1 [6].

например. -

for (int i = 0; i < 19; ++i) 
    WorkArray1[i] = whatever computation is required. 

Чтобы сделать это в Javascript, я полагаю, что полный массив может быть передан на подпрограммы, плюс еще одна переменных для хранения смещения. А затем в рамках подпрограммы смещение должно быть добавлено к значению индекса массива.

e. г. -

for (int i = 0; i < 19; ++i){ 
WorkArray1[offset + i] = whatever computation is required. 

Но теперь я передаю еще одну переменную в подпрограммы, и нужно добавить смещение к индексу массива каждый раз через петлю.

Есть ли лучший способ сделать это в Javascript? Есть ли способ имитировать способность C++ передавать адрес определенного элемента массива в функцию?

+0

В языках с управляемой памятью язык, как правило, полностью контролирует создание ссылок. Итак, ** нет **, вы не можете этого сделать. – Pointy

ответ

1

Самый чистый способ заключается в сращивании массива и передаче в подмашине с текущего индекса. Таким образом, у вас все еще есть одна ссылка, и все остается чистым.

Но нет, массивы на большинстве языков более высокого уровня не позволяют ссылаться на один элемент, а затем возвращаются к массиву. Это опасно по ряду причин на тех типах языков, где базовые данные могут даже не сохраняться соприкосновенно. JavaScript не является исключением и вы можете передать массив и индекс или подмассивы, но вы не можете передать ссылку на элемент в массиве и вернуться к массиву после его передачи.

+0

Кроме того, JavaScript Массивы - это просто хеш-таблицы с целыми ключами и несколько специальных действий. – Touffy

0

Ответ Тима правильный. Я просто хочу добавить что-то о C-like typed arrays: они могут быть созданы как представление в ArrayBuffer, и в этом случае вы могли бы создать новый вид того же буфера, что и больший массив, но начиная со смещения, и передать это , без дублирования базовых данных. Ближе всего вы можете дойти до указателей.

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]. Таким образом, передача аргумента передает копию указателя, но не самого указателя.

+0

Обратите внимание, что я имею в виду использование массива или объекта, так это то, что этот трюк также можно выполнить с помощью '[[1], [2], [3]]', и функция просто будет обращаться к нему как 'v_obj [0]' – slebetman

+0

Это никоим образом не отвечает на вопрос о передаче указателей конкретным индексам в массиве. Действительно хорошее описание того, как js обрабатывает byref/byval, хотя – Tim

+0

@Tim: Он отвечает на его вопрос «есть способ подражать способности C++ ...». И ответ - да, есть. Но это хаки. – slebetman

Смежные вопросы