前言

这个问题其实困惑了我好久,但是在实际使用中总是得过且过,不想去深究。由于这种态度,在学习 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.深入函数传参的机制

其实函数接受参数之前,会先在函数作用域内创建一个局部变量,并把传入的参数赋予创建的局部变量,如果值类型传递,就是重新开辟一块内存存储传入变量的值,并把新创建的变量指向此内存地址,因此对此变量的修改并不会影响到外部变量的值;

如果传入的不是值类型,则仅仅是对变量进行引用赋值操作,只是把新创建的局部变量指向外部变量的地址,因此对局部变量的修改就相当于对外部变量的修改。

转载于:https://www.cnblogs.com/hisheng/p/6693000.html

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

  1. js函数传参时:值传递和引用传递的区别

    值传递是单向的传递,只能由实参传递给形参,而不能由形参传递给实参,因为值传递的数据,地址和值是一个内容,所以修改形参的数据不会影响到实参的数据.所以形参的改变不会影响到实参. 值传递就是在函数调用中函 ...

  2. 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!...

    看了很多关于阐述JAVA传参到底是值传递还是引用的问题,有些说得很肤浅让人感觉似懂非懂的感觉,但是好像又能解决一些问题,然后就止步了.还有一些则是,讲得很深奥,看着好像很有道理的样子,但是其实还是没怎 ...

  3. java 传值为不可变_Java函数传参(String的不可变性)

    本篇博客无意讨论Java里面函数传参是否只有值传递还是值传递和引用传递同时存在,仅讨论函数传参的一些原理. 一. 什么是函数传参? 最常见的一个swap函数:下面这个swap函数并不能实现我们想要的交 ...

  4. Java执行JavaScript代码:传参、获取变量、返回值、JSON对象

    脚本包 Java 脚本功能是在 javax.script 包中.这是一个比较小的,简单的API.脚本的出发点是 ScriptEngineManager 类,ScriptEngineManager是一个 ...

  5. JS函数传参时:值传递与引用传递的区别

    JS函数传参时:值传递与引用传递的区别 一.先分析基础数据与复杂数据的区别 : 基本数据类型:Undefined.Null.Boolean.Number.String 引用数据类型:对象 如:var ...

  6. 论JS函数传参时:值传递与引用传递的区别

    JS函数传参时:值传递与引用传递的区别? 值传递:值传递的数据为基本数据类型,基本数据类型在内存中存放的是数值本身:值传递为单向传递,只能由实参传递给形参. 引用传递:引用传递的数据为复杂数据类型,复 ...

  7. JS中函数传参按照值传递

    ES语法中所有函数的参数都是按值传递的. 探讨函数参数按值传递问题: //1.参数被赋值为原始值 function add(num){num += 10;return num; } let count ...

  8. Shell函数(函数定义、函数变量、函数调用、函数传参、函数返回值、获取函数返回值)

    分享知识 传递快乐 1.函数定义 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.Shell 函数定义的语法格式如下: [function] funname [()]{函 ...

  9. JS一起学02:函数传参、操作属性第二种方式、提取行间事件、循环、this、焦点问题、联动选择、选项卡焦点图

    一.函数传参     1.函数传参:参数就是占位符----函数里定不下来的东西 var a1=function(){ alert(123); }; function a(f){ // 相当于 f=a1 ...

最新文章

  1. ios 如何在cell中去掉_IOS之表视图单元格删除、移动及插入
  2. python的表达式3or5_Python 简明教程 --- 5,Python 表达式与运算符
  3. 机器学习-分类算法-模型的保存和加载12
  4. C++版二叉树非递归遍历
  5. [Unity] 战斗系统学习 8:构建 TPS 框架 3:mono 组件
  6. 重识JavaScript 之 数据类型的相互转换
  7. indesign教程,如何在对象周围环绕文本?
  8. Spring Boot 构建电商基础秒杀项目 (二) 使用 Spring MVC 方式获取用户信息
  9. python-数据结构-大学生-航空订票系统
  10. android系统下载管理器,android 系统下载管理器
  11. ASML公司Q3季度营收27.9亿欧元
  12. 仿钉钉后台流程设计图
  13. 嵌入式学习资料和项目汇总
  14. Ghost系统前的配置方法大全
  15. 单片机右移c语言程序,51单片机+点阵8*8上、下、左、右移显示C程序(原创)
  16. 远距离蓝牙路由器产品:桂花网Cassia S2000介绍
  17. 数据泄露事件频发,病毒入侵猖獗,装上MCK就能杜绝
  18. golang 获取一天前,一个月前,一年前的日期
  19. 计算机辅助园林,计算机辅助园林景观设计
  20. Bootstrap置信区间和GEV拟合pdf

热门文章

  1. 你是否已经忘了Serlvet是什么?
  2. hotmail发送邮件html,HTML电子邮件中的链接在Hotmail中不起作用
  3. android音频测试方法,Android左右声道音频文件测试
  4. php怎么求阶乘_如何实现一个PHP类来计算整数的阶乘?(代码详解)
  5. 【Elasticsearch】 es ES节点memory lock重要性与实现方式
  6. 【ElasticSearch】Es 源码之 NodeConnectionsService 源码解读
  7. 【SpringCloud】服务注册之 Consul
  8. 【Clickhouse】CLICKHOUSE SQL文件等常用语句
  9. SparkStreaming之updateStateByKey
  10. 95-220-020-源码-Idle-Flink中Idle停滞流机制