在某个听书软件上发现了一本《javascript高级程序设计》的书籍,每次睡觉前时候都会听听,稀稀拉拉听了一年多,每次都会睡着耽误了很多进度。过年这几天又听了听,感觉js函数中参数的传递这块比较好玩,总结写出来。
- 基本类型值 比如Undefined,Null,Boolean,Number,String。
- 引用类型值,比如Object,Array,Function,Date等。
所以传递也分为两种了,下面开始基础知识代码部分:
基本类型复制
var num1 = 10;
var num2 = num1;
console.log(num2);//10
这两个是完全一样的,修改任何一个都不会影响另外一个。
引用类型复制
var obj1 = {
name : "111"
};
var obj2 = obj1;
console.log(obj2.name); //111
obj2.name = "222";
console.log(obj1.name); //222
这两个是地址指针完全一样的,修改任何一个都会影响另外一个。
如果有什么不懂得可以去看我的另外有关对象深浅复制的笔记。
这里不过多解释。
函数参数的传递
《javascript 高级程序设计》上是这样叙述参数传递的:所有函数的参数都是按值传递的,也就是说把函数外部的值复制给函数内部的参数。
基本类型作为参数传递
var count = 10;
function num(num1){
num1 = 1;
return num1;
}
var result = num(count);
console.log(result);//1
console.log(count);//10,并未变成1
对象作为参数传递 专注一点 看内存有没有改写
var person = {
name : "Tom"
};
function obj(peo){
peo.name = "Jerry";
return peo;
}
var result = obj(person);
console.log(result.name);// Jerry
console.log(person.name);// Jerry
看到这里是不是有蒙了,没错,结果表明这是引用关系(指针)的复制方式。
但是,仔细看下面例子:
var person = {
name : "Tom"
};
function obj(peo){
peo = {
name : "Jerry"
};
return peo;
}
var result = obj(person);
console.log(result.name);// Jerry
console.log(person.name);// Tom
仔细看你会发现不同,下面没有像上面使用peo.name = "Jerry"
下面而是直接写出来一个对像
peo = {
name : "Jerry"
};
在函数中重新定义了一个对象,也就是现在堆内存中有两个对象
所以此时上面和下面是是两个不同的返回值