javascript函数的参数都是按值传递的

js高程里面有这么一句话

zhihu上面有人给出的比较好的解释,整理如下:

https://www.zhihu.com/question/51018162

简单类型(字符串,数字)1.值传递 2. 引用传递

复杂类型
1、将参数的值完全复制一份,按值传递
2、将参数的地址复制一份,按值传递地址,即引用复制(reference-copy)传递
3、对于参数的完全引用传递(c# 中的 ref 关键字、php 中的 & 等等。)

原因是复杂类型会在内存中占据一定的空间,而变量的值实际上是该空间的内存地址;在进行参数传递的时候,是将 dict1 的地址值复制了一份传给 dict。这样在修改该复杂对象(这里是一个字典)的成员的时候,因为 dict 和 dict1 指向内存的同一个空间,因此对于dict的成员的修改是直接作用在这个内存空间上,dict1的成员值自然也就随之变化了。但如果对 dict 重新赋一个字典变量,会在内存里开一个新的空间用于存储新的字典,同时将该空间的地址赋给 dict,但 dict1 的地址值不变,还是指向旧的字典,两个变量之间的联系就被切断了。

原因是 ref 方式传递是 dict1 本身,按地址传递,属于引用,与第2点的区别就是没有将地址复制一份再进行传递。

var a = [1, 2];

var change = function(arr) {
  arr.push(3)
  return arr;
};

console.log(change(a));
console.log(a);
var a = [1, 2];

var change = function(arr) {
  arr = [2, 3];
  return arr;
};

console.log(change(a));
console.log(a);

posted @ 2018-11-06 14:51  wynnzen  阅读(184)  评论(0编辑  收藏  举报