今天在看JavaScript中参数的定义时做的笔记
--ECMAScript中的所有参数传递都是值传递,不可能通过引用传递参数
--包括引用类型,也只是传递了所引用的值,而不是参数本身的引用
--通过传递的引用的值可以修改引用类型的值
--但是无法修改参数本身的引用
--初看时会觉得很疑惑,难道和我之前学过的c,java,php不一样吗
--对象,数组在函数中的传递不是 “引用传递” 吗?怎么也成了值传递?
--反应了半天后,才明白,其实是我之前一直理解错了
--对象,数组在一般函数中的传递其实是值传递的,只有c语言的&引用传递,才是真的引用传递
值传递
对于一个对象,或者数组,生命初始化给一个变量,其实是把这个对象,数组的引用赋值给这个变量
var a = [1,2,3]; var b = a; b[0] = 2; a //2,2,3
我们通过这个引用可以修改这个数组或是对象,这里没问题把
当我们通过变量向函数传递数组或对象时,其实传递的也只不过是这个变量所保存的值,而这个值代表数组或是对象的引用;
引用类型变量的赋值,也是把这个值(引用)拷贝给另一个变量而已
function f(x) { x[0] = 5; x = new Array(); x[0] = 3; x[1] = 2; } var a = [1, 2, 3]; f(a); a //[5, 2, 3]
因为我们传递的只是这个变量的值(这个值是数组的引用),这个参数x接受了这个值(这个值是数组的引用)
所以我们可以通过内部的参数对这个引用进行修改,通过变量a访问数组也会返回被修改后的结果
但是当我们试图去修改参数x的值(这个值是数组的引用),让他指向一个新的数组时,
只是修改的参数x的值(这个值是数组的引用),而不会影响变量a的值(这个值是数组的引用)
以上就是所谓的值传递
引用传递
将所传递的变量的地址传递给函数,此时参数就是这个变量的一个别名
对这个参数进行修改,就是对这个原变量进行操作
典型的引用传递就是c语言的&(取地址)操作
1 #include <stdio.h> 2 void swap(int& a, int& b) 3 { 4 int tmp; 5 tmp = a; 6 a = b; 7 b = tmp; 8 } 9 10 int main() 11 { 12 int i = 3, j = 4; 13 printf("before swap:i=%d,j=%d ", i, j); 14 swap(i, j); 15 printf("After swap:i=%d,j=%d ", i, j); 16 return 0; 17 }
此处参考博客 值传递和引用传递-----函数参数传递的两种方式