js 对象的值传递

时间:2022-04-16 03:32:54

一、变量赋值的不同

1、原始值

在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的。

js 对象的值传递

2、引用值:

在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,

也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。

js 对象的值传递

二、参数传递的不同

首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。但是为什么涉及到原始类型与引用类型的值时仍然有区别呢,就是因为内存分配时的差别。

  • 原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
  • 引用值:对象变量它里面的值是这个对象在堆内存中的内存地址!因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了。

三、对象的值传递

  • 改变对象内存地址:如果参数赋值另一个对象时,这个参数就会更改它的值为新对象的内存地址指向新的对象,此时与原对象相互独立;
  • 改变对象的内部属性:如果这个参数是改变对象内部的属性的话,这个改变会体现在外部,因为他们共同指向的这个对象被修改了!
var obj1 = {value:''};
var obj2 = {value:''};
function changeStuff(obj){
// 实际上这里简写一步obj = obj1;而不是将obj直接看成obj1
obj.value = ''; // ①
obj = obj2; // ②
return obj.value;
}
var foo = changeStuff(obj1);
console.log(foo); // '222' 参数obj指向了新的对象
console.log(obj1.value); // '333'

解析:

①将obj1的对象地址复制给obj,这样,obj和obj1共同指向一个对象地址!

同时改变obj的value属性(obj.value=333),obj1的value值也随着改变(obj1.value=333)!

②将obj2的对象地址复制给obj,obj指向obj2的对象地址。(obj.value=222)

js 对象的值传递的更多相关文章

  1. 晨叔技术晨报: 你真的搞懂JS中的“值传递”和“引用传递”吗?

    晨叔周刊,每周一话题,技术天天涨. 本周的话题是JS的内存问题(加入本周话题,请点击传送门). 图 话题入口 今天的技术晨报来,就来谈谈JS中变量的,值传递和引用传递的问题.现在,对于很多的JSer来 ...

  2. java对象只有值传递,为什么?

    在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好阅读本文. 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递.如果是个引用,就 ...

  3. C++ //拷贝构造函数调用时机//1.使用一个已经创建完毕的对象来初始化一个新对象 //2.值传递的方式给函数参数传值 //3.值方式返回局部对象

    1 //拷贝构造函数调用时机 2 3 4 #include <iostream> 5 using namespace std; 6 7 //1.使用一个已经创建完毕的对象来初始化一个新对象 ...

  4. 动态修改JS对象的值及React setState

    一.在JS里使用(非ES6) 实现场景: 给一个空对象填充某一指定数组内的值 并随机生成数量 const fruit = ['apple', 'banana', 'orange'] let fruit ...

  5. js对象属性值初始化封装函数

    在平常做项目的过程中,总是会遇到需要对一个已经定义过的对象的属性值进行初始化,且对象的属性值的类型有多种(string.number.array.object.boolean),为了方便自己就简单封装 ...

  6. js对象属性值为对象形式取值方式

    console.log(rowData);//取带点的属性值 console.log(rowData['layoutPipegallery.pipegallerycode']);//取带点的属性值

  7. js对象取值的两种方式

    :"李四"}; var v1 = obj.name1; //张三, 使用点的方式 //报错,不能使用点的方式 ]; //李四,使用中括号的方式 var key = "na ...

  8. 关于js对象值的传递

    结合红宝书和网上的一些文章,记录下自己对关于js对象的值的传递的一些理解. js对象是保存在堆内存中的,当把对象赋值给变量时,是把对象在堆内存的引用(地址)赋值给了变量,变量通过地址来访问对象.下面来 ...

  9. 你们不要再吵了&excl; Java只有值传递&period;&period;

    写在前边 上次聊到Java8新特性 lambda时,有小伙伴在评论区提及到了lambda对于局部变量的引用,补充着博客的时候,知识点一发散就有了这篇对于值传递还是引用传递的思考.关于这个问题为何会有如 ...

随机推荐

  1. 超千个节点OpenStack私有云案例(1):CERN 5000&plus; 计算节点私有云

    CERN:欧洲核子研究组织 本文根据以下几篇文章整理而来: https://www.openstack.org/summit/tokyo-2015/videos/presentation/unveil ...

  2. XCOJ 1168 &lpar;搜索&plus;期望&plus;高斯消元法&rpar;

    题目链接: http://xcacm.hfut.edu.cn/oj/problem.php?id=1168 题目大意:D是起点,E是终点.每次等概率往某个方向走,问到达终点的期望步数.到不了终点或步数 ...

  3. download youtube video

    using youtube-dl to download youtube video: (1) sudo apt-get install youtube-dl (2) run.sh #!/bin/ba ...

  4. 一个想法照进现实-《IT连》创业项目:一个转折一个反思

    前言: 距离上一篇介绍IT连创业项目的文章,已经过去2个月了,没想到我竟然这么久没写文章向大伙汇报进度了,实在抱歉. 关于这事,我得好好反省,认真检讨,好好写文,哈. 今天主要是讲述一下最近创业的进展 ...

  5. Spring Boot &lbrack;使用 Druid 数据库连接池&rsqb;

    导读 最近一段时间比较忙,以至于很久没有更新Spring Boot系列文章,恰好最近用到Druid, 就将Spring Boot 使用 Druid作为数据源做一个简单的介绍. Druid介绍: Dru ...

  6. Vue 插槽

    插槽的概念: 插槽的关键字slot,默认情况下,组件中的模板会覆盖组件中的原始内容(即自定义标签对内部的内容会不显示),解决办法就是使用插槽. 组件的原始内容: 即在vue实例范围之内,因此可以调用实 ...

  7. linux 7安装telnet,设置telnet自启动,使用root telnet登录

    1.安装启动服务 # yum install telnet-server # yum install xinetd # systemctl enable xinetd.service # system ...

  8. js实现input的赋值

    input框赋值如下所示,是一个文本框的html代码,实际开发中,要涉及到将数据库中的数据取出然后放入input框中. <input id="name1" name=&quo ...

  9. idea使用actiBPM插件中文乱码

    idea 安转activiti插件后,编辑流程图发现保存后中文乱码,并且idea的字符集(Settings—>Editor—>File Encodings)已经设置为UTF-8,流程图中中 ...

  10. c&plus;&plus; primer plus 第四章 课后题答案

    #include<iostream> #include<string> using namespace std; int main() { string first_name; ...