javascript 函数传参方式(按值传递还是按引用传递)

javascript 函数传参方式(按值传递还是按引用传递)

分析

首先,回顾一下js的数据类型有那些。

原始类型: Undefined、Null、Boolean(布尔值)、Number(数值) 和 String(字符串)。 原始数据值是一种没有额外属性和方法的单一简单数据值。

引用类型: Object。

在js引擎中对变量的存储主要有两种位置,堆内存栈内存。

栈内存主要用于存储各种基本类型的变量。而堆内存主要负责像对象Object这种变量类型的存储。

img

两种类型在使用上的区别:
1.复制变量
基本类型
var num1 = 1;
var num2= num1 ;
num2= 5;
console.log(num1);  //  1  
console.log(num2);  //  5

num2改变了,但是num1没有跟着改变 (原始类型复制的是自己在栈内存中的值

引用类型
var obj1 = new Object();
obj1.num = 1;
var obj2 = obj1;
obj2.num = 2;
console.log(obj1.num); //  2 
console.log(obj2.num); //  2

num2 改变了,但是 num1 也跟着改变 (引用类型复制的是自己在栈内存中的“指针”值,“指针”指向的是堆里面的数据)

2.传递参数
function abc(num) {
   num += 1; 
   return num; 
}
var i = 5;
var result = abc(i);
console.log( i ); // 5  
console.log( result ); // 6

看上面demo可以看出 参数传参(原始类型) 是值传递.。

function hello(obj) {   
  obj.name = 'lucy'; 
  return obj; 
}
var person = new Object();
person.name = 'lili'; 
var newPerson = hello(person);
 console.log(hello.name); // lucy
console.log(newPerson.name); // lucy

上面demo可以看出 参数传参好像是引用传递。但是实际是传递了“指针”这个值。下面demo可以看出这一点。

function hello(obj) {
    obj.name = 'lucy';
    obj = new Object(); // 新赋值了一个地址
    obj.name = 'lili';
    return obj;
}

var person = new Object();
person.name = 'jon';
var newPerson = hello(person);
console.log(person.name); // lucy 
console.log(newPerson.name); // lili 

请添加图片描述

请添加图片描述

可以看着上面的图片来理解
当我把 person 传进去的时候,实际是传递了“指针”(就是它的内存地址)这个值 ,并不是person 本身。那么传进hello函数是 person和obj 拥有相同内存地址,因此改变了 obj,name的值就是改变了person.name 的值。当 obj 赋于一个新的内存地址的时候 ,obj的内存地址就和person的内存地址不是同一个了,因此改变了obj,name的时候 person,name是不会改变的。

因此,函数参数传递的是内存地址这个值,函数传递参数就是按值传递的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值