JS的函数参数传递
来源:互联网 发布:淘宝网新款针织衫 编辑:程序博客网 时间:2024/05/16 17:29
JS中,所有的函数参数都是按值传递的。
“按值传递”指:把实参的值复制一份给形参。
JS中,变量保存的是地址。
1. 基本类型变量存的是值,复杂类型的变量存的是内存地址。
2. 基本类型在赋值的时候拷贝值,复杂类型在赋值的时候只拷贝地址,不拷贝值。
附一篇文章:
JS里基本类型(值)和复杂类型(引用)有什么区别?
短答案:
1. 基本类型变量存的是值,复杂类型的变量存的是内存地址。
2. 基本类型在赋值的时候拷贝值,复杂类型在赋值的时候只拷贝地址,不拷贝值。
长答案:
在讲解这个问题之前,我们需要看一下计算机是如何储存变量的。如果计算机要存储一个整数,它可以用 32 个位(bit)来存储,一个小数,可以用 64 位来存储。但不管怎样,位数都是固定的。
假设有如下 JS 代码:
var a = 1.23var b = 3.14
对应的内存是这样:
接下来加几行代码:
var obj = {}var c = 1.628
现在,计算机遇到一个难题,到底用多少位来存 obj 呢?
用固定位数有一个问题,如果程序员之后往 obj 上添加属性(如 obj.a = 1.23; obj.b = 2.34),那么 obj 用的位数可能放不下这两个小数。
有人说,「那给 obj 分配足够多的位数不就好了,比如一万位,总够用吧?」不行,这样做一来浪费内存,二来一万位也不一定够用,万一 obj 里面的属性非常多呢?
引入另一种内存
为了解决 obj 存储的问题,计算机将程序里的内存分成两种,一种是上图所示,按顺序使用用内,每个数据占据的位数是固定的,这种内存叫做「栈内存」;另一个,就是专门用来存储位数不固定的数据,存的时候不一样按顺序一个一个存,这种内存叫做「堆内存」。
我们来看 obj 应该怎么存储:
如图, obj 在栈内存那里,只占固定位数(32位或64位或其他都可以),里面存的并不是数据{a:1.23,b:2.34},里面存的是数据「在内存中的位置」(类似于引用或者指针)。
堆内存里,会开辟一块空间来存放 {a:1.23, b:2.34}。
「如果我再给 obj 添加一个属性怎么办呢?obj.c = 3.45」
好问题,那么 obj.c 依旧会放到堆内存,同时占用的内存空间也会动态的变化,以盛放 obj.a、obj.b 和 obj.c 三个小数。具体怎么动态变化,则是由 JS 引擎来负责的,暂且不表(我也不会)。
值 V.S. 引用
如果变量存储的是原始值,那么这个变量就是值类型,在 JS 里也叫做基本类型。
如果变量存储的是内存位置,那么这个变量就是引用类型,在 JS 里也叫复杂类型,也就是对象。
值类型在赋值的时候是直接拷贝的,而引用类型则只拷贝地址。
值类型的赋值举例:
var a = 1.23var b = a
对应的内存结果为:
引用类型的赋值举例:
var a = {name: 'a'}var b = a
对应内存结果为:
也就是说,a 和 b 都存储着「同一块内存」的地址!那么就会有一个问题:
当我们修改 b.name 的时候,a.name 也会跟着变:
b.name = 'b'a.name === 'b' // true
以后再说如何解决这个问题。
以上,就是对「值」和「引用」的区别的浅析。想了解更多前端知识,请加 Q 群:222459918。
- js函数:参数的传递
- JS的函数参数传递
- JS得到地址栏传递参数的函数
- js得到地址栏传递参数的函数
- js中函数参数是按值传递的
- JS中函数参数的传递
- js第五节-函数参数的传递
- js函数中参数的传递
- 关于js函数的参数传递问题
- js函数中参数的传递
- js函数中参数的传递
- js中函数的传递参数
- JS 函数和参数的传递
- 【08】js函数中参数的传递
- js函数中参数的传递
- js中函数参数的值传递和引用传递
- JS函数参数传递问题
- js函数传递两个参数
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
- 浅谈.h .cpp
- python基础入门四
- oracle中merge into用法
- Largest Rectangle in a Histogram POJ
- JS的函数参数传递
- 解决使用TortoiseGit后文件夹出现蓝色问号
- Drawerlayout侧滑菜单
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- 精选20道Java多线程面试题并有答案! 互联网IT技术 2017-10-14 00:02 1. 多线程使用的优缺点? 优点: (1)多线程技术使程序的响应速度更快 (2)当前没有进行处理的任务
- 第一章课后习题
- 数据库探索之旅——数据类型
- hdu6183(线段树动态开点)
- 利用ECharts3来实现ECharts2实例中的模拟迁徙效果,即背景地图为百度地图。 标签: ECharts3Echarts2模拟迁徙百度地图引入 2016-10-24 16:21 10065人阅