变量的复制&传递
变量的复制
变量的类型
可以分为基本数据类型(Null、Undefined、Number、String、Boolean)和引用类型(Funtion、Object、Array)
基本数据类型是按照值访问,可以直接操作保存在变量中实际的值
引用数据类型是按引用访问的,值是保存在对象上的对象,我们可以对引用类型的值进行添加、改变、删除方法和属性的操作
复制变量值
把A复制给B:首先创建B,再将A的值赋值到新变量被分配的内存中
基本数据类型复制的是值,复制后,两个变量之间独立不影响
引用数据类型复制的是引用地址,复制后,将变量对象中存储的指针复制给新变量分配的内存,两个变量的引用地址相同,指针属于同一个对象,两者之间的变化相互影响


传递参数
所有函数的参数都是按值传递,把函数外部的值复制给函数内部的参数。
基本数据类型值的传递就是复制值给一个局部变量(命名参数),引用类型值的传递就是复制值在内存中的地址给一个局部变量。因此变量的变化可以反映在函数的外部。
基本类型传递:
var count = 20;
function addTen(num){
num+=10;
return num;
}
var result = addTen(count)
alert(count);
alert(result);
count是全局变量,
addTen(count)的作用将count的值复制给局部变量num,值加10,体现在返回值num在result上,result=30
对count没有改变,count=20;
引用类型传递:
var person = new Object();
function setName(obj){
obj.name = 'xia'
}
setName(person);
console.log(person.name);

先声明了一个对象person,
创建设置名字的函数setName,并传入person,将person对象的地址复制给obj,从而person对象上增加了属性name
为了说明传递时对象是按值传递而不是按引用传递,看下列例子
var human = new Object();
function setMessage(obj){
obj.age = 19;
obj = new Object();
obj.name = 'XIA';
obj.age = 18;
}
setMessage(human);
console.log(human.age)
console.log(human.name)

先声明对象human,
创建函数setMessage,可以给对象添加属性,但函数中又重新定义了一次对象,并添加属性,会发生什么呢?
如果参数是引用传递的话,
human先是复制给obj,添加了age属性为19,重新定义对象后,对象内被重置,再添加属性age=18,name=’XIA‘,
最后输出结果应该为:18,XIA
但是真实输出结果为:19,undefined
就是说,参数是按值传递的,可以看上图,obj在重新定义后就指向新的内存空间了并变化属性(局部变量,使用后销毁),human没有相应的变化-原始引用不变,可知这是值传递的复制。
变量的复制&传递的更多相关文章
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
函数参数传递本质上和变量整体复制一样,只是两个变量分别为形参a和实参b.那么,a=b后,a变了,b值是否跟着变呢?这取决于对象内容可变不可变 首先解释一下,什么是python对象的内容可变不可变? p ...
- JavaScript传递变量:值传递?引用传递?
今天在看 seajs-2.2.1/src/util-events.js源码,里面有段代码不是很理解: var events = data.events = {} // Bind event seajs ...
- java变量和javascript变量之间的传递
java代码是运行在服务器上的,返回的值只是静态的存在于页面,而javascript是脚本语言,是运行在客户端的!它们是两种完全不同的语言,变量不能直接进行交换,但是通过一定的方式,变量可以传递. j ...
- Matlab M文件变量检测与传递
M文件中变量的检测与传递 可变数量的输入输出变量(varargin,vararout): Matlab的输入输出变量数量可变,并具有以下特点: 可变输入输出变量必须在正常变量之后 varargin和v ...
- OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析
☞ ░ 前往老猿Python博文目录 ░ 一.使用全局变量进行变量传递 OpenCV-Python中可以使用setMouseCallback来设置鼠标事件的回调函数,我们来看个样例. 1.1.案例1代 ...
- HttpRunner3的变量是如何传递的
HttpRunner3的变量可以在测试类的用例配置中通过variables添加,也可以在测试步骤中使用extract().with_jmespath()提取出来放到变量x,再用$x传递给下一个接口使用 ...
- 环境变量LD_LIBRARY_PATH的传递
http://bbs.chinaunix.net/thread-3680861-1-1.html execv明显没有传环境变量,execle或execve才会带在启动shell设置的LD_LIBRAR ...
- 关于变量参数的传递,python让人蛋痛的地方
def find_file(file_table): with open(file_table, 'r', encoding='utf-8') as read_f: line_dict = {} fo ...
- JavaScript 参数传递与变量复制
ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 5 种基本数 ...
随机推荐
- 048_末晨曦Vue技术_处理边界情况之使用$root访问根实例
处理边界情况之使用$root访问根实例 点击打开视频教程 在每个 new Vue 实例的子组件中,其根实例可以通过 $root property 进行访问. 例如,在这个根实例中: src\main. ...
- vscode 插件 Cnblogs Client For VSCode
目录 简介 主要功能 登录 / 授权 将本地 markdown 文件发布到博客园 博客园博文列表 将本地文件关联到博客园博文 拉取远程博文内容更新本地文件 图片上传 博文分类管理 导出 pdf 博文设 ...
- 【MySQL】从入门到掌握2-下载安装
上期:[MySQL]从入门到掌握1-一些背景知识 第一章:下载 官网下载地址: https://dev.mysql.com/downloads/mysql/ https://dev.mysql.com ...
- C++ 性能小测 1 二维数组的遍历效率
C++ 性能小测 1 二维数组的遍历效率 遍历二维数组时,常规思路是使用一个嵌套循环.一方面,由于 CPU 使用了分支预测技术,因此通常将循环次数最多循环的放在最内层.另一方面,由于二维数组是按行存储 ...
- 截取url后缀扩展名方法
原本使用 Path(_['video']['downloadUrl']).suffix 获取文件扩展名,没想到出错了,查明原因发现某视频链接是https://xx.xxx.xxx/xx/xxxx.mp ...
- 【Oracle初学者】ORA-01034: ORACLE not available
系统报错代码 ORA-01034: ORACLE not available 出现原因 //在启动实例时,关闭了数据库,导致外部软件无法访问Oracle数据库(大部分都是因为数据库监听或者服务关闭导致 ...
- 关于Ubuntu系统无法输入中文的问题,即使做了种种修改
原网址:https://shurufa.sogou.com/linux/guide 在经历一晚上一及一下午的奋战后,找到了最终解决方案,该解决方案使用的是搜狗输入法 在操作之前有以下注意事项:所有操作 ...
- 三门问题模拟对比试验——附VB6和Python3源程序及EXE文件
三门问题模拟对比试验 [直接跳转到文件下载] 前言 "三门问题"是一个很有意思的概率论问题,涉及贝叶斯公式,是人工智能领域的一个经典问题. 为了直观地研究这个问题,也为了测试一下P ...
- Windows LDAP加固之LDAP签名
微软计划于2020年1月推出补丁更新,启用LDAP签名.虽然目前版本的操作系统已经包含了这个功能,但是微软并没有将它启用.随着时间推移,网络上的威胁越来越多.凭据重放和中间人攻击在LDAP的攻击中显得 ...
- 工具推荐-使用RedisInsight工具对Redis集群CURD操作及数据可视化和性能监控
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 0x00 快速 ...