Это то, что, как я понимаю, передается по ссылке в C (примечание: я не C программист):
void foo(int* x) { // The value of the memory address passed into `foo` is copied into parameter `x`
*x = 1; // The memory address x is dereferenced(?) and the value at that location overwritten
}
int main() {
int a = 0;
foo(&a); // The value of the (starting?) memory address associated with `a` is found and supplied as an argument to the function call
// `a` is now `1`
}
Таким образом, независимо от типа x
(даже если это объект (структура в C?)), изменения, сделанные в x
внутри foo
, будут отражены в области действия main, , даже если весь объект будет заменен .
В JavaScript примитивы просто копируются, и об этом достаточно просто рассуждать.
Но для объектов, IIU C, значение их адреса памяти (или эквивалент) передается в функцию foo
, которая внешне звучит аналогично приведенному выше коду C. Однако, если мы присвоим значение идентификатору, созданному параметром x
, это будет , а не , отраженное в области действия main
.
function foo(x) {
x = { bam: 'this is bam' }; // The value of the memory address passed into `foo` is copied into parameter `x`
}
function main() {
let a = { bar: 'this is bar' };
foo(a); // The value of the memory address associated with `a` is found and supplied as an argument to the function call (?)
// `a` is unchaged
}
JavaScript передается ценность. Для объектов его иногда называют передачей по значению ссылки - достаточно справедливо - но в приведенном выше коде C значение ссылки (указатель ОК) также копируется в функцию. Итак, как я могу описать различия между передачей по ссылке и передачей по значению? Является ли передача значений на самом деле одинаковыми, но отличается только поведение ссылок / разыменования двух языков?