码迷,mamicode.com
首页 > 编程语言 > 详细

Javascript 之《函数传参到底是值传递还是引用传递》

时间:2017-04-11 12:58:56      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:引用类型   种类   为什么   传值   函数   没有   字符串   geo   今天   

前言

这个问题其实困惑了我好久,但是在实际使用中总是得过且过,不想去深究。由于这种态度,在学习 Javascript 过程中,水平一直都是出于半桶水状态,很多概念和原理似懂非懂,模糊不清。

所以,写了一系列的《Javascript 之 ...》就是为了端正态度,认真地研究一下 Javascript 的特性和原理,夯实基础。

今天,这一篇探究的是函数传参的问题:函数传参到底是传值还是传的引用?

 

1.如果是引用传递

var name = ‘JS‘;
function changeName(name){
    name = ‘Javascript‘;  
console.log(‘name changed: ‘+name) } changeName(name); // name changed: Javascript console.log(name);
// ‘JS‘

为什么 name 没有变呢?

如果是引用传递的话,name 应该是会发生变化的。这么说应该是值传递?

也许你下意识也觉得没变是正常的,但这是因为你的经验告诉你的。我们暂且按下不表,看看下一种可能性。

 

2.如果是值传递

var obj = {name: ‘JS‘};
function changeObjName(obj){
    obj.name = ‘Javascript‘;
    console.log(‘Obj.name changed: ‘+obj.name);  
}
changeObjName(obj); // Obj.name changed: Javascript
console.log(obj); // {name: ‘Javascript‘}

为什么这一次传入的参数被改变了?不是值传递吗?这么说是引用传递了?

那上面的例子又是怎么回事?开始一头雾水了...

 

3.到底是值传递还是引用传递??

其实在 Javascript 的世界中,函数传参并不是一定是一种传参方式,主要依据传入的参数而定。主要有两种情况:

1. 如果是值类型

基本数据类型的变量基本上都是值类型,例如字符串,数值,布尔值等。

值类型的传参是值传递,函数内对这种类型参数的修改不会影响到原来传入的值。

2. 如果是引用类型

复合数据类型如对象,数组等都是引用类型。

引用传参是引用传递,函数内对这种类型参数的修改都会影响到原来传入的值。

 

4.深入函数传参的机制

Javascript 之《函数传参到底是值传递还是引用传递》

标签:引用类型   种类   为什么   传值   函数   没有   字符串   geo   今天   

原文地址:http://www.cnblogs.com/hisheng/p/6693000.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!