js函数参数传递类型

参考不同人归纳和代码实例,做些学习小结

 javascript 数据类型可以分为两类:

  • 基本类型值 primitive type :      比如Undefined,Null,Boolean,Number,String
  • 引用类型值,也就是对象类型 : Object type,比如Object,Array,Function,Date

 

一变量复制时

基本类型数据作为参数传递时传递值,比如:

var num1 = 10;//num1赋值为10
var num2 = num1;//num1的值赋值给num2;
console.log(num2);//10  ,num2=10;
num2 += 1;//num2的值+1;
console.log(num1); //10  打印出num1=10,说明num1不被num2的值影响
console.log(num2); //11  num2=11了;

然而对象类型被复制时

var obj1 = {
  name : "111"
};
var obj2 = obj1;
console.log(obj2.name); //111
obj2.name = "222";
console.log(obj1.name); //222

obj1赋值给obj2,obj2对象指向新对象时,obj2.name=222,obj1也改变,obj1.name=222。

理由:对象被复制时并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存指向这个对象指针的变量。obj1的值复制给obj2,而这个值的副本实际上是一个指针,这个指针指向存储在堆中的一个对象,也就是说创建了一个新的内存地址传给了obj2,obj1和obj2两个变量同时指向了同一个Object,当去改变这个对象时,他们的值都会改变,也就是说他们中任何一个作出的改变都会反映在另一个身上。

 

二函数传递参数时

《js高级程序设计》上是这样叙述参数传递的:所有函数的参数都是按值传递的,

也就是说把函数外部的值复制给函数内部的参数

基本数据类型:

var count = 10;
function num(num1){
   num1 = 1;
   return num1;
}
var result = num(count);
console.log(result);//1

console.log(count);//10,count虽然被做实参调用了,但输出的值是10,说明count被复制了一个副本值传给了函数,但自身的值未改变

 

对象传参实例

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

在上面的例子中,把person复制传入obj()中,peo和person指向了同一个对象,而在peo中修改了name属性,其实修改了它们共同指向的对象的name属性,相对应的外部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

        上面的例子中,在函数中重新定义了一个对象,也就是现在堆内存中有两个对象,外部的person指向的是老的对象,被传入参数后指向的是新定义的对象,所以调用后返回的值是新定义的对象的值。如果是参数是按引用传递的,那么person.name打印出来的结果为Jerry,从这点可以得出参数是按值传递的(有的地方叫做按共享传递)。

通过别人的思路来学习,不妥之处请见谅。

参考:https://www.cnblogs.com/open-wang/p/5208606.html

 

 

 

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值