函数的参数传递

按值传递

按值传递:修改形参的值并不会影响实参。但如果传递的是引用类型,形参的值也会影响实参。
按引用类型传递:修改形参的值实参的值也会改变。
js中所有函数的参数都是按值传递的。

function sayName(obj){
    obj.name='lili'
}
var Person=new person()
sayName(Person)
alert(Person.name)//当函数里面的obj.name变化时,外面的Person.name也变化了

但这不是按引用类型传递比如下面的一种情况:

function sayName(obj){
    obj.name='lili'
    var obj={};
    obj.name="mary"
}
var Person=new person()
sayName(Person)
alert(Person.name)//当obj重新被定义后,里面的修改没有反映到外面,如果是按引用类型传递的话外面的也会变化。

实例

代码输出

引用类型:对象,数组,函数,正则表达式
非引用类型:数值,字符串,布尔值,undefined,null。
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);//false,因为obj1和obj2指向不同的地址
console.log(obj1 = obj2);//{1,2}赋值的返回值是变量的值而不是true,之所以返回{1,2}是因为obj2把引用复制给了obj1,指向同一个对象。
console.log(obj1 == obj2);//true,因为二者的地址相同

代码输出(变量赋值)

var a = 1
var b = 2
var c = { name: '饥人谷', age: 2 }
var d = [a, b, c]

var aa = a
var bb = b
var cc = c
var dd = d

a = 11
b = 22
c.name = 'hello'
d[2]['age'] = 3

console.log(aa) //输出1,因为基本类型赋值后两个变量相互独立,a随然改成了11,但aa不受影响。
console.log(bb) //输出2,理由同上。
console.log(cc)//输出{name:'hello',age:2},引用类型赋值,只是地址的复制,一个变量改变,另一个也变化,所以c.name改成了‘hello’,cc也跟着变
console.log(dd)//输出[11,22,{name:'hello',age:3}]数组也是引用类型,所以理由同上,最后一个通过数组索引把age改成了3。

代码输出(函数传参)

var a = 1
var c = { name: 'jirengu', age: 2 }

function f1(n){
++n
}
function f2(obj){
++obj.age
}

f1(a)
f2(c)
f1(c.age)
console.log(a) //输出1,基本类型传值,a和n并不互相影响,只是a的值复制给了n而已。
console.log(c)//输出{name:'jirengu',age:3}引用类型,是地址的复制,一个变量变化,另一个也会变化。

你可能感兴趣的:(函数的参数传递)