javascript - 我如何描述这两种价值传递方式之间的区别?
问题描述
这就是我理解的在 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
inside所做的更改foo
都会反映在 main 的范围内,即使整个对象被替换。
在 JavaScript 中,原语只是简单地复制,这很容易推理。
但是对于对象 IIUC,它们的内存地址(或等价物)的值被提供给 function foo
,这在表面上听起来类似于上面的 C 代码。但是,如果我们给由 parameter 创建的标识符赋值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 是按值传递的。对于对象,它有时被称为 pass-by-value-of-the-reference - 很公平 - 但在上面的 C 代码中,引用的值(OK 指针)也被复制到函数中。那么如何描述按引用传递和按值传递之间的区别呢?值的传递实际上是否相同,但只是两种语言的引用/取消引用行为不同?
解决方案
C 通过值1传递所有内容。有时这些值是指针值;这与通过引用传递不同。
在真正的引用传递系统中,函数定义中的形式参数指定与函数调用中的实际参数相同的对象(假设实际参数不是数字文字,无论如何)。无论是通过使用指针还是在后台或通过不同的机制来完成,都是实现的功能。在 C 语言中从来没有这种情况。
中的表达式 *x
指定与中foo
的表达式相同的对象a
,main
但形式参数x
是与 中的不同对象a
。表达式 的结果&a
按值传递并存储在唯一对象x
中。
x == &a // int * == int *
*x == a // int == int
- 数组很奇怪。除非它是
sizeof
或一元运算符的操作数&
,或者是用于在声明中初始化字符数组的字符串字面量,否则“N 元素数组”类型的表达式T
将被转换(“衰减”)为键入“pointer toT
”,表达式的值将是数组第一个元素的地址。当您将数组表达式作为参数传递给函数时,函数会接收指向第一个元素的指针,而不是整个数组的副本。因此,与其他参数类型不同,函数中数组参数内容的更改会反映在调用者中。然而,这仍然不是真正的引用传递。这只是 C 有点独特的数组语义的后果。
推荐阅读
- c# - 通过 C# 创建帐户时的 Active Directory 密码策略实施
- html - div,左边是图像,右边是标题和文本
- postgresql - 如何在 PostgreSQL 中构建高效的多重查询功能?
- oracle-sqldeveloper - 如何在 Oracle SQL 中组合整数列以形成日期
- java - 比较 ArrayList 中的元素值
- javascript - 包含函数无法识别文本变量中的子字符串
- xamarin - 如何更改Android(Xamarin Forms)上按钮的文本对齐方式?
- clickhouse - 对数组进行分组和计数
- visual-studio - 无法在 Visual Studio 2015 中安装“Visual Studio 安装程序”
- android - 将 Java 转换为 Kotlin 错误后实现代码