欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于函数参数引用介绍

程序员文章站 2022-04-19 18:40:30
函数参数的引用是按值引用的,这句话理解的不是很好。对于基本数据类型,比较好理解。具体例子也是常见: var num1 = 10  var num2 = num1;&n...

函数参数的引用是按值引用的,这句话理解的不是很好。对于基本数据类型,比较好理解。具体例子也是常见:

var num1 = 10 

var num2 = num1; 

console.log(num2)//10 

num2 = 0 

console.log(num2)//0 

console.log(num1)//10 

就是num2 复制了num1的value.之后两个变量在栈stack中是并存的,互不影响的两个独立变量,修改一个值不会影响另一个。函数中体现如下:

   `

var count = 5

function test(num){

        num = 10

        return num

var res = test(count) 

console.log(res)//10 //res是在函数中生成的新变量。传入时初始值为5,在函数内部被修改成10。而这一变化不影响count本身的值。 

console.log(count)//5 

`

引用数据类型在理解的时候要绕个弯。我们很容易答出下面的例子:

var obj = { 

id:1 

var obj2 = obj; 

obj2.id=0 

console.log(obj2.id)//0 

console.log(obj.id)//0 

对象在被复制时,是复制的指针。即obj和obj2在堆heap中是指向同一个位置的。obj2修改了该位置的值,就等于修改了obj的值。 

在函数中也常见该知识的运用:

var vehicle1 = { 

id:1, 

plateNumber:'鲁B12345' 

function reset(veh){ 

veh.id=0 

return veh; 

var result = reset(vehicle1) 

console.log(result.id)//0 在函数内部,传入的是指向vehicle1的指针 

console.log(vehicle1.id)//0 

但是上面的例子怎么说明引用数据类型也是按值引用的呢? 

有的人解释是:对于引用数据类型,其值就是指针。我目前也是这么理解的,但是还是有点不透彻,不像基础数据类型那样明白。但是有个例子很好的佐证了这个观点:

var obj1={ 

id:0 

function testObj(obj2){ 

obj2 = { 

id:2 

return obj2; 

var res = testObj(obj1) 

console.log(res.id)//2 

console.log(obj1.id)//0 

res.id=4 

console.log(res.id)//4 

console.log(obj1.id)//0

在上面例子里,在函数内部重新实例化了一个对象。即函数参数初始值是传入的obj1 , 但是在函数内该变量的指针被修改,指向了id为2的位置,和obj1是互不影响的。当又一次修改res的id时,obj1仍然保持不变。 

在这个例子里,作为被传递的引用类型的值:指针,一旦在函数内部被修改后,也和之前的变量失去了联系。

不知道上面的分析有无不妥之处,欢迎朋友们指出和交流。多谢。