首页 > 其他分享 >在js函数的参数都是按值传递的吗?

在js函数的参数都是按值传递的吗?

时间:2024-12-29 09:34:10浏览次数:5  
标签:20 函数 对象 js 传递 引用 change 按值

在JavaScript中,函数的参数传递方式实际上是基于变量的类型来决定的。JavaScript中的数据类型大致可以分为两类:原始类型(Primitive Types)和对象类型(Object Types)。

  1. 原始类型(Primitive Types):这些类型包括NumberStringBooleanNullUndefinedSymbol(ES6新增)和BigInt(ES10新增)。当你向函数传递一个原始类型的值时,JavaScript会按值传递(Pass by Value)。这意味着函数内部对参数的任何修改都不会影响到函数外部的原始变量。
let x = 10;

function change(num) {
    num = 20;
}

change(x);
console.log(x); // 输出 10,不是 20

在这个例子中,x的值没有被change函数修改,因为numx的一个副本。

  1. 对象类型(Object Types):这些类型包括所有对象,如数组(Array)、日期(Date)、正则表达式(RegExp)以及自定义对象等。当你向函数传递一个对象时,JavaScript实际上是按引用传递(Pass by Reference)的“引用值”。这意味着函数内部和函数外部都引用了同一个对象,因此函数内部对对象的修改会影响到函数外部的对象。

然而,需要注意的是,尽管对象是按引用传递的,但如果你试图更改引用本身(即让引用指向一个新的对象),这种更改不会影响到函数外部的引用。这是因为引用的值(即内存地址)是按值传递的。

let obj = { value: 10 };

function change(o) {
    o.value = 20; // 修改对象属性,影响外部对象
    o = { value: 30 }; // 尝试更改引用本身,不影响外部对象
}

change(obj);
console.log(obj.value); // 输出 20,不是 30

在这个例子中,obj.valuechange函数修改为20,但是当我们尝试更改o以引用一个新对象时,这种更改没有影响到obj

综上所述,JavaScript中的参数传递方式可以视为“按值传递”,但对于对象类型,传递的是引用的值(即内存地址),而不是对象本身。这导致对象在函数内外的行为类似于“按引用传递”,但仅在修改对象属性时如此;如果尝试更改引用本身,则不会影响外部变量。

标签:20,函数,对象,js,传递,引用,change,按值
From: https://www.cnblogs.com/ai888/p/18638435

相关文章

  • 请说说你对JS引用赋值,按值赋值的理解
    在JavaScript中,变量的赋值可以大致分为两类:引用赋值和按值赋值。这种分类主要基于JavaScript的数据类型,特别是原始类型(PrimitiveTypes)和对象类型(ObjectTypes)。按值赋值(ValueAssignment)按值赋值通常发生在处理原始类型的数据时,这些原始类型包括:Number、String、Boolean、Nul......
  • 使用js写个方法计算5000年内有多少个对称日,如:20211202,反过来也是一样
    要编写一个JavaScript函数来计算5000年内有多少个对称日,你可以按照以下步骤进行:确定起始和结束日期。遍历这个日期范围内的每一天。对于每一天,将其转换为YYYYMMDD格式的字符串。检查该字符串是否是对称的。如果是对称的,则计数器加一。以下是一个实现这个功能的JavaScript......
  • 手动实现一个compose函数
    在前端开发中,compose函数通常用于组合多个函数,使得这些函数可以按照指定的顺序依次执行,并将前一个函数的输出作为后一个函数的输入。这样的函数组合方式在函数式编程中非常常见。下面是一个简单的compose函数的实现,它接受一系列函数作为参数,并返回一个新的函数,这个新函数会按......
  • 如何理解在js中访问变量有按值和按引用两种方式?
    在JavaScript中,理解变量的访问方式——按值访问和按引用访问——是理解语言数据结构和行为的关键。这两种方式主要取决于变量的数据类型。按值访问(PassbyValue)在JavaScript中,原始类型(PrimitiveTypes)的数据是按值访问的。原始类型包括:Number、String、Boolean、Null、Un......
  • js Map结构,forEach可以进行遍历,普通for循环为什么不进入执行?
    在JavaScript中,Map是一个键值对集合,它允许你使用任何类型作为键(不仅仅是字符串或符号)。Map对象提供了多种方法来遍历和操作键值对,包括forEach方法。forEach方法是Map对象内置的,它允许你传入一个回调函数来遍历Map中的每个元素。这个方法会自动遍历Map并调用你提供的函......
  • Go基础之函数和方法讲解
    目录1自定义函数1.1函数定义1.2函数调用与返回多值1.2.1返回类型1.2.2命名返回值1.3函数参数1.3.1值传递1.3.2引用传递1.3.3不定参数1.4函数变量&回调1.4.1函数变量1.4.2函数回调1.5匿名函数1.6defer函数1.6.1定义1.6.2使用方式1.6.3参数求值1.6.4LIFO执行顺序......
  • cdn.jsdelivr.net 国内无法访问的替代加速域名网址
    替代域名下面提供一些可替代cdn.jsdelivr.net的地址。jsd.cdn.zzko.cnjsd.onmicrosoft.cntestingcf.jsdelivr.netquantil.jsdelivr.netfastly.jsdelivr.netjsdelivr.b-cdn.netjsdelivr.codeqihan.comjsd.duolaa.topcdn.bili33.topjsd.proxy.aks.moecdn.jsdelivr.......
  • Nodejs_vue大学生实习实训项目基地管理系统
    文章目录项目源码技术介绍具体实现截图开发工具和技术简介课题重点难点:课题重点难点:实施方案:选题特色nodejs类核心代码部分展示系统测试演示视频/源码获取/联系我项目源码技术介绍本系统设计模式是B/S模式,依照MVC进行分层。用户:项目申报,查看公告信息,个人中心,项目申......
  • 【开源免费】基于SpringBoot+Vue.JS学生宿舍信息管理系统(JAVA毕业设计)
    本文项目编号T100,文末自助获取源码\color{red}{T100,文末自助获取源码}......
  • 【开源免费】基于SpringBoot+Vue.JS大学生竞赛管理系统(JAVA毕业设计)
    本文项目编号T101,文末自助获取源码\color{red}{T101,文末自助获取源码}......