首页 > 其他分享 >js中的传值与传址

js中的传值与传址

时间:2023-05-17 09:48:21浏览次数:29  
标签:传址 console name js 传递 参数 user 传值 log

在 JavaScript 中,传递参数时有两种方式:按值传递(pass by value)和按引用传递(pass by reference),即传值与传址。


一、按值传递(传值)

基本(简单)数据类型都是传值:number、boolean、字符串、null、undefined,都存储在栈中。

按值传递意味着在函数调用时,会将参数的值复制一份,然后将这个副本传递给函数。这意味着函数内对参数的修改不会影响原始变量。

function updateValue(value) {
  value = 10;
}

let num = 5,
    num1 = num;
num1 = 2
updateValue(num);
console.log(num); // 输出 5,因为函数内部的修改不会影响到原始变量
console.log(num1); // 输出 2,因为同一作用域下会影响到原始变量

二、按引用传递(传址)

复杂数据类型都是传址:object、date、array等,堆:存储复杂数据类型的数据,栈:存储地址

 按引用传递意味着在函数调用时,会将参数的引用(内存地址)传递给函数。这意味着函数内对参数的修改会影响到原始变量。

const user = {
    name: "cyy",
  };
  function changeUser(user) {
    user.name = "xcd";
    user = {
      name: "wff",
    };
    //user.name = "gly";  
    //console.log("changeUser作用域:", user.name); //gly
    console.log("changeUser作用域:", user.name); //wff    此处代码和特殊情况一样
  }
  changeUser(user);
  console.log(user.name); //xcd
  // 如果将 changeUser 中的user.name = 'xcd' 注释掉 console.log(user.name); //cyy

此外,还有一种特殊情况是,当按值传递的参数是一个对象时,实际上传递的是对象的引用。这会导致函数内部可以修改对象的属性,但不能修改对象本身(即不能将参数指向一个新的对象)。 

function updatePerson(person) {
  person.name = 'John';
  person = { name: 'Alice' }; // 这里不能修改原始对象的引用
}

let personObj = { name: 'Bob' };
updatePerson(personObj);
console.log(personObj); // 输出 { name: 'John' },因为函数内部修改了对象的属性

 三、总结

  • 基本数据类型是按值传递的,函数内对参数的修改不会影响原始变量。
  • 对象类型是按引用传递的,函数内对参数的修改会影响原始变量,但不能将参数指向一个新的对象,对象名和参数名一样,则是重新创建了一个新的对象。

标签:传址,console,name,js,传递,参数,user,传值,log
From: https://www.cnblogs.com/cyy22321-blog/p/17407574.html

相关文章

  • 程序员怎么学爬虫JS逆向
    爬虫JS逆向(也称为前端逆向、JS破解等)是指通过分析JavaScript代码,破解前端加密算法或构造相应的模拟请求,从而有效地模拟人类用户完整的操作行为实现数据爬取。  以下是一些常见的爬虫JS逆向技术:1、自动识别Javascript解码器如果前端使用了Javascript编码来隐藏有价值的数据......
  • SpringBoot添加JSP支持
    ①创建一个新的MavenWeb项目,命名为SpringBoot_jsptest建成之后会如上图所示,报错是因为没有加入jsp的支持。②按照Maven规范,在src/main/下新建一个名为resource的文件夹,并在下面新建static以及templates文件夹修改pom.xml文件:      1、在url标签后面加入parent元素: <!--......
  • JSON
        案例:  ......
  • 2023年5月最新全国省市区县和乡镇街道行政区划矢量边界坐标经纬度地图数据 shp geojso
    发现个可以免费下载全国 geojson 数据的网站,推荐一下。支持全国、省级、市级、区/县级、街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3、Echarts等geojson数据下载地址:https://geojson.hxkj.vip该项目github地址:https://github.com/TangSY/echarts-m......
  • 关于 rxjs 编程中的 take(1) 操作
    对rxjs中的Observable使用take(1)操作符不会引起副作用。take(1)只是取Observable中第一个发出的值,并且会立即完成。它会使得Observable中只有一个值被发出并且完成,而不会影响其他代码。然而,如果Observable中包含了副作用操作,例如调用了HTTP请求或者改变了共享状......
  • vue2 + fabric.js 实现撤销、恢复效果
    全部代码<template><div><canvasid="canvas"width="400"height="400"style="border:1px"></canvas><button:disabled="!canUndo"@click="historyState(stateIndex-1)......
  • JS和Document
    对象1.newvarobj=newObject();2.函数声明对象functionHuman(){};3.varobj={};大括号就是对象varobj={};obj.name='张三';obj.age=20;obj.say=function(){};4.varobj={};大括号内放入属性用:varobj={ name:'张三', age:20, sex:0, run:functi......
  • js深拷贝
    js深拷贝在JavaScript中,有多种方法可以实现对象的深拷贝,下面介绍几种常用的方式:手动遍历对象进行复制functiondeepCopy(obj){if(typeofobj!=='object'||obj===null){returnobj;}letnewObj=Array.isArray(obj)?[]:{};for(letkeyin......
  • threejs webgl性能优化
    threejswebgl性能优化WEBGL性能优化的方法有很多,以下是一些常见的方法:减少渲染次数:在WEBGL中,渲染次数越少,性能越好。因此,您可以通过减少渲染次数来提高性能。例如,使用批处理技术将多个对象合并为一个批处理对象进行渲染。降低纹理分辨率:纹理分辨率越高,渲染的时间就越长。......
  • JS逆向 -- 分析某站aid、cid、w_rid和sid的加密过程
    接上节课内容JS逆向--分析某站buvid3和_uuid的加密过程JS逆向--分析某站b_lsid值加密过程一、清除cookie信息,刷新网页,ctrl+f搜索sid,这样找到的数据是在url里或者响应信息里面,全局搜索找到的一般都是在js里面的数据,找到一个v2的数据包,里面有setcookie二、该数据包是get请求,分析......