值传递和引用传递

今天在看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\n", i, j);
14     swap(i, j);
15     printf("After  swap:i=%d,j=%d\n", i, j);
16     return 0;
17 }

此处参考博客 值传递和引用传递-----函数参数传递的两种方式

 

posted @ 2018-08-06 20:19  Luking  阅读(208)  评论(0编辑  收藏  举报