函数参数传递

九旬
• 阅读 478

函数参数传递

在 JavaScript 中函数传参,分为两种:

  • 基础类型(Number、String、Boolean..)
  • 引用类型(Object、Array、Funcion..)

基础类型传参

看下面的例子:

let str = 0;
function log(prop) {
    prop = 1
    console.log(prop)
}
log(str)// 1
console.log(str)// 0

比较好理解,其实就是复制了一个值传入了函数中,复制的值修改了,原值不会修改。

引用类型传参

看例子:

let obj = { value: 0 }
function log(prop) {
    prop.value = 1
    console.log(prop)
}
log(obj)// { value: 1 }
console.log(obj)// { value: 1 }

给函数传了一个对象进去,然后在对象中修改属性的值,会导致原值的属性也被修改。 其实传入函数的是复制的一个对象的内存引用地址,修改对象的属性是通过复制的内存地址找到的这个对象,然后修改的是原对象上的属性。

如果将传过来的的引用地址在重新复制,是可以的:


let obj = { value: 0 }
function log(prop) {
    prop = { value: 1 }
    console.log(prop)
}
log(obj)// { value: 1 }
console.log(obj)// { value: 0 }

将复制的引用地址 重新赋值一个新的对象,则当前赋值的这个对象(1)和传进的对象(0)就毫无关系了。

总结

所以,对于函数的参数传递,普通类型传递的是值的副本,而引用类型传递的是引用地址的副本。

参考

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
ROS回调函数传参
ROS编程过程中遇到不少需要给回调函数传递多个参数的情况,下面总结一下,传参的方法:一、回调函数仅含单个参数voidchatterCallback(conststd_msgs::String::ConstPtr&msg){ROS_INFO("Iheard:%s",msg
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
typeScript数据类型
//布尔类型letisDone:booleanfalse;//数字类型所有数字都是浮点数numberletdecLiteral:number6;lethexLiteral:number0xf00d;letbinaryLiteral:number0b101
LinMeng LinMeng
3年前
js之传值与传址/undefined和null/严格模式
传值与传址基本数据类型有五种Undefined、Null、Boolean、Number和String引用数据类型有两种object,array,fn两种数据类型的区别:1.存储位置不同原始数据类型直接存储在栈(stack)中简单数据段,占据空间小,大小固定,属于被频繁使用的数据,所以存储在栈中;引用数据类型直接存
LinMeng LinMeng
3年前
vue中页面间跳转传值的两种方式(query,params)
两者都可以传递参数,区别是什么?query传参配置的是path,而params传参配置的是name,在params中配置path无效query在路由配置不需要设置参数,而params必须设置query传递的参数会显示在地址栏中params传参刷新会无效,但是query会保存传递过来的值,刷新不变;query:this.$route
Wesley13 Wesley13
3年前
Java对象的浅拷贝和深拷贝&&String类型的赋值
Java中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行赋值操作、方法传参或返回值时,会有值传递和引用(地址)传递的差别。浅拷贝(ShallowCopy):①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
26 函数形参值回传问题——C++解决多个return的一般方法
0引言在使用数组和vector作为函数的参数进行参数传递并希望得到值的回传时,由于不知道怎么写数组函数形参的引用形式,一直采用vector的引用形式。但是,刚刚测试了一下,发现数组作为参数本身就是指针,根本不需要采用引用形式把值回传啊,把测试结果写下来。1 关于数组作为函数参数的值传递问题——数组和容器的对比  数组直接作为
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
九旬
九旬
Lv1
男 · 北京 · 前端
种一棵树最好的时间在十年前,其次是现在。
文章
6
粉丝
3
获赞
7