javascript深入参数传递
我们都知道javascript的基础数据类型有: Undefined 、 Null 、 Boolean 、 Number 、 String 。
如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把值复制到为新变量分配的位置上。
- code
var num1 = 1;
var num2 = num1; // 1
num2 = 5; // 5
console.log(num1) // 1
此后,这两个变量可以参与任何操作而不会相互影响。
- 函数传参有有区别吗?
var a = 5
function b(num) {
num = 4
return num
}
b(a); //4
a; //5
- 注意这只是基本数据类型, 如果改成引用类型会怎么样?
var p1 = {
name: "Tom"
}
function b(obj) {
obj.name = "Jerry"
return obj
}
b(p1) // { name : "Jerry"}
p1.name // Jerry
| 栈内存 | 堆内存 | |
| p1, obj | 指针地址 | { name :"Tom" } |
obj.name = "Jerry"
obj修改了堆内存里的name值, p1还是指向那个地址. 所以p1跟着变了.
- 这样会怎么样?
var p1 = {
name: "Tom"
}
function b(obj) {
obj.name = "Jerry"
obj = {}
obj.name = "Jack"
return obj
}
b(p1) // { name : "Jack"}
p1; // { name: "Jerry" }
看到结果按照上面的意思应该p1也是{ name : "Jack"}但是为什么不同呢?
1 . 先修改了共同指向的堆内存里的name值
- 第一步
| 栈内存 | 堆内存 | |
| p1, obj | 指针地址 | { name :"Tom" } |
- 第二步
| 栈内存 | 堆内存 | |
| p1, obj | 指针地址 | { name :"Jerry" } |
2 . obj重新赋值引用类型,其实就是改变了obj的指针,并没有改变p1的指针指向的地址里的值
- 第三步
| 栈内存 | 堆内存 | |
| p1 | 指针地址 | { name :"Jerry" } |
| obj | 指针地址 | { } |
- 第四步
| 栈内存 | 堆内存 | |
| p1 | 指针地址 | { name :"Jerry" } |
| obj | 指针地址 | { name: "Jack" } |
javascript深入参数传递的更多相关文章
- JavaScript 函数参数传递到底是值传递还是引用传递
tips:这篇文章是听了四脚猫的js课程后查的,深入的理解可以参看两篇博客: JavaScript数据类型--值类型和引用类型 JavaScript数据操作--原始值和引用值的操作本质 在传统的观念里 ...
- JavaScript函数参数传递
Hello,今天和大家分享下JS中的一个基本概念:函数参数传递! 先来看看一个DEMO var str="hello world"; function func(s){ s=&qu ...
- JavaScript变量和作用域
认识JavaScript中的变量 JavaScript中的变量有两种类型,一种是基本类型.一种是引用类型. 基本数据类型:Defined,Null,Boolean,Number,String.注意St ...
- JavaScript入门培训材料(Copy至此以作备份)
JavaScript简明学习教程 2014年5月31日 目录 一.说明... 2 二.准备知识... 2 (一)HTML. 2 (二)DOM.. 3 三.JavaScript简介... 3 四.Jav ...
- 学习笔记:JavaScript传参方式———ECMAScript中所有函数的参数都是按值传递
我们把命名参数(arguments)视为局部变量,在向参数传递基本类型值时,如同基本类型变量的复制一样,传递一个副本,参数在函数内部的改变不会影响外部的基本类型值.如: function add10( ...
- Javascript二(函数详解)
一.函数 Javascript是一门基于对象的脚本语言,代码复用的单位是函数,但它的函数比结构化程序设计语言的函数功能更丰富.JavaScript语言中的函数是"一等公 ...
- javascript变量浅析
变量声明 javascript 使用var + 变量名 声明变量,因为javascript是弱类型语言, 所有我们可以随意更改已有变量的类型. var b=1; b='2', 另外不同于c#中的var ...
- 常用javascript内置对象——String对象
创建 String 对象的语法: 1:new String(s); :2:String(s); :3:直接赋值 String中属性 String中方法 <script> window.on ...
- JS 中没有按地址(引用)传递,只有按值传递
很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = [] var v2 = ...
- Octopus系列之一些问题的汇总
1._WidgetCart.html中的数量更新函数和删除函数,转移到MyShoppingCart.html中出错 如果你使用的是jQuery的方式banding函数 比如change 和click, ...
随机推荐
- 等保测评--postgresql修改默认超级用户,建立普通用户使用
1.postgresql权限说明 SELECT INSERT UPDATE DELETE TRUNCATE REFERENCES TRIGGER CREATE CONNECT TEMPORARY EX ...
- 聊聊MySQL是如何处理排序的
本文分享自华为云社区<MySQL怎样处理排序️如何优化需要排序的查询?>,作者:菜菜的后端私房菜. 前言 在MySQL的查询中常常会用到 order by 和 group by 这两个关键 ...
- 基于webapi的websocket聊天室(一)
上一次我已经讲了在webapi主机上面加入websocket中间件. 这次就更进一步,搭建一个websocket局域网聊天室. 传送门-->webapi添加添加websocket中间件 下一篇 ...
- ES集群的扩缩容
ES集群节点的扩容缩容案例 1.在集群中添加和删除节点 当您启动Elasticsearch实例时,您正在启动一个节点.Elasticsearch集群是一组具有相同cluster.name属性的节点.当 ...
- Avalonia中的线性渐变画刷LinearGradientBrush
在WPF中使用Shape实现复杂线条动画后,尝试在Avalonia中也实现同样效果.尽管官方提供了从WPF到Avalonia的快速入门文档,但由于第一次使用Avalonia,体验过程中并不是很顺利,主 ...
- 自定义Naive UI的数据表格Data Table中按钮Button图标
在Naive UI官网中详细介绍了[数据表格 Data Table](数据表格 Data Table - Naive UI)的使用方式 { title: "Action", key ...
- QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台.在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他 ...
- .NET快速实现网页数据抓取
前言 今天我们来讲讲如何使用.NET开源(MIT License)的轻量.灵活.高性能.跨平台的分布式网络爬虫框架DotnetSpider来快速实现网页数据抓取功能. 注意:为了自身安全请在国家法律允 ...
- Android 13 - Media框架(30)- ACodec(六)
关注公众号免费阅读全文,进入音视频开发技术分享群! 前一节我们了解了input buffer写入的流程,知道了起播写前几笔数据时会先获取graphic buffer,这一节我们就一起来了解下deque ...
- docker离线安装
1. yum安装 #源添加 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo ...