JavaScript基础 -- 变量、作用域与内存

第四章 JavaScript 的变量、作用域与内存 # 4. 小结 (1)JavaScript 变量可以保存两种类型的值:原始值和引用值; (2)原始值有6种:Undefined、Null、Boolean、Number、String 和 Symbol; (3)原始值大小固定,因此保存在**栈内存上**; (4)从一个变量到另一个变量复制原始值会创建该值的第二个副本; (5)引用值是对象,存储在**堆内存上**; (6)**包含引用值的变量实际上只包含指向相应对象的一个指针,而不是对象本身**; (7)**从一个变量到另一个变量复制引用值只会复制指针,因此结果 阅读详情

1 原始值与引用值

原始值就是最简单的数据,引用值则是由多个值构成的对象。在把一个值赋给变量时,JavaScript引擎必须要确定这个值是原始值还是引用值
原始值大小固定,保存在栈内存上;引用值是对象,存储在堆内存上
它们存在以下不同:

  1. 动态属性

定义的方式很类似,都是创建一个变量再给它赋值,但在变量保存了这个值以后,对于引用值来说,可以随时添加、修改和删除其属性和方法;原始值不能有属性,尝试添加也不会报错

PS:原始类型的初始化可以只使用原始字面量形式,如果使用 new 关键字,JavaScript则会创建一个 Object 类型的实例

在这里插入图片描述

  1. 复制值

从一个变量到另一个变量复制原始值会创建该值的第二个副本,这两个变量可以独立使用,互不干扰

包含引用值的变量实际上只包含指向相应对象的一个指针,而不是对象本身;从一个变量到另一个变量复制引用值只会复制指针,因此结果是两个变量都指向同一个对象


  1. 传递参数

ECMAScript中所有函数的参数都是按值传递的,函数外的值会被复制到函数内部的参数中,复制方式跟上面提到的规则一样

对象是按值传递的,比如下面这个例子:
在这里插入图片描述
如果 person 是按引用传递的,那么 person 应该自动将指针改为指向 name 为 Greg 的对象,而 name 值是 Nicholas,这表明函数中参数的值改变之后,原始的引用没有变。当 obj 在函数内部被重写时,它变成了一个指向本地对象的指针,而那个本地对象在函数执行结束时就被销毁了

PS:ECMAScript中函数的参数就是局部变量


  1. 确定类型

typeof操作符适合用来判断一个变量是否为原始类型,但值是对象或null,判断结果都是object

而对于引用值,我们通常不关心一个值是不是对象,而想知道是什么类型的对象,instanceof则来判断,如果变量是给定引用类型的实例,则返回true。按照定义,所有引用值都是object,因此检测任何引用值和 object 构造函数都会返回true

2 执行上下文与作用域

任何变量都存在于某个执行上下文中(也称为作用域),这个上下文决定了变量的生命周期,以及它们可以访问代码的哪些部分。每个上下文都有一个关联的变量对象,而这个上下文中定义的所有变量和函数都存在这个对象上。执行上下文分全局上下文、函数上下文和块级上下文
1)全局上下文是最外层的上下文,在浏览器中,全局上下文就是 window 对象

2)每个函数调用都有自己的上下文,当代码执行流进入函数时,函数的上下文被推到一个上下文栈上,ECMAScript程序的执行流就是通过这个上下文栈进行控制的

代码执行流每进入一个新上下文,都会创建一个作用域链,用于搜素变量和函数

如果上下文是函数,则其活动对象用作变量对象,它最初只有一个定义变量:arguments。作用域链中的下一个变量对象来自包含上下文,再下一个对象来自再下一个包含上下文,以此类推直到全局上下文;全局上下文的变量对象始终是作用域链的最后一个变量对象

此外,局部作用域中定义的变量可用于在局部上下文中替换全局变量,比如下面这个例子:
在这里插入图片描述
下图展示了上面例子的作用域链:
在这里插入图片描述
内部上下文可以通过作用域链访问外部上下文中的一切,但外部上下文无法访问内部上下文的任何东西,上下文之间的连接是线性的、有序的

PS:函数参数被认为是当前上下文中的变量,因此也跟上下文中的其他变量遵循相同的访问规则

2.1 作用域链增强

某些语句会导致在作用域链前端临时添加一个上下文,这个上下文在代码执行后会被删除,通常在下面这两种情况下会出现这个现象:

  • try/catch语句的 catch 块
    • 会创建一个新的变量对象,它会包含要抛出的错误对象的声明
  • with语句
    • 会向作用域链前端添加指定的对象

2.2 变量声明

除了 var 声明变量,ES6还增加了 let 和 const 关键字

  1. 使用 var 的函数作用域声明

在使用 var 声明变量时,变量会被自动添加到最接近的上下文,在函数中,最接近的上下文就是函数的局部上下文。如果变量未经声明就被初始化了,那它就会自动被添加到全局上下文

var 声明会被拿到函数或全局作用域的顶部,位于作用域中所有代码之前,这叫做"提升"


  1. 使用 let 的函数作用域声明

let 的作用域是块级的,块级作用域由最近的一对包含花括号{}界定。let 在同一作用域内不能声明两次,重复的 var 声明会被忽略,而重复的 let 声明会抛出SyntaxError

let 适合在循环中声明迭代变量,使用 var 声明的迭代变量会泄漏到循环外部


  1. 使用 const 的函数作用域声明

使用 const 声明的变量必须同时初始化为某个值,一经声明,在其生命周期的任何时候都不能再重新赋值,其他跟 let 声明一样

const 声明只应用到顶级原语或对象,换句话说,赋值为对象的 const 变量不能再被重新赋值为其他引用值,但对象的键则不受限制;如果想让整个对象都不能修改,可以使用Object.freeze(),这样虽然不会报错但赋值会失败
在这里插入图片描述
在这里插入图片描述
由于 const 声明变量的值是单一类型且不可修改,JavaScript运行时编译器可以将其所有实例都替换成实际的值,而不会通过查询表进行变量查找,谷歌的 V8 引擎就执行这种优化

3 垃圾回收

JavaScript是使用垃圾回收的语言,也就是说执行环境负责在代码执行时管理内存,通过自动内存管理实现内存分配和闲置资源回收。基本思路:确定哪个变量不会再使用,就释放它占用的内存,这个过程是周期性的,即垃圾回收程序每隔一段时间就会自动执行

以函数中局部变量的正常生命周期为例:函数中的局部变量会在函数执行时存在,栈(或堆)内存会分配空间以保存相应的值;函数在内部使用了变量,然后退出;此时不再需要那个局部变量了,它占用的内存可以释放。这种情况下显然不需要局部变量了,但并不是所有时候都这么明显。垃圾回收程序必须跟踪记录哪个变量还会使用,以及哪个变量不会再使用。标记未使用的变量的实现方式主要有标记清理和引用计数这两种标记策略

3.1 标记清理

JavaScript最常用的垃圾回收策略是标记清理。当变量进入上下文,会被加上存在于上下文中的标记;当离开上下文时,也会被加上离开上下文的标记。给变量加标记的方式有很多种,比如反转某一位,或者维护"在上下文中"和"不在上下文中"两个变量列表。标记过程的实现并不重要,关键是策略

垃圾回收程序运行的时候,会标记内存中存储的所有变量,然后将所有在上下文中的变量,以及被在上下文中的变量引用的变量标记去掉。在此之后再被加上标记的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了。随后垃圾回收程序做一次内存清理,销毁带标记的所有值并收回自己的内存

3.2 引用计数

另一种没那么常用的垃圾回收策略是引用计数,其思路是对每个值都记录它被引用的次数,当一个值的引用数为 0 时,就说明没办法再访问到这个值了,垃圾回收程序下次运行的时候就会释放引用数为0的值的内存

这种策略存在循环引用的问题,objectA 和 objectB 通过各自的属性相互引用,引用数永远不会是0,如果函数被多次调用,则会导致大量内存永远不会被释放
在这里插入图片描述

3.3 性能

垃圾回收程序会周期性运行,如果内存中分配了很多变量,则可能造成性能损失,因此垃圾回收的时间调度很重要。开发时不知道什么时候运行时会收集垃圾,最好的办法是在写代码时要做到:无论什么时候开始收集垃圾,都能让它尽快结束工作

现代垃圾回收程序会基于对 JavaScript 运行时环境的探测来决定何时运行,探测机制因引擎而异,但基本上都是根据已分配对象的大小和数量来判断的

3.4 内存管理

JavaScript基于安全考虑,分配给浏览器的内存通常比分配给桌面软件的少很多,为了避免运行大量 JavaScript 的网页耗尽系统内存而导致操作系统崩溃。这个内存限制不仅影响变量分配,也影响调用栈以及能够同时在一个线程中执行的语句数量

优化内存占用的最佳手段是保证在执行代码时只保存必要的数据,如果数据不再必要,就将其设置为null,从而释放其引用,这也叫解除引用。这个建议最适合全局变量和全局对象的属性,局部变量在超出作用域后会被自动解除引用,如下面例子所示:
在这里插入图片描述
localPerson 在 createPerson() 执行完成超出上下文后会自动被解除引用,不需要显式处理。但 globalPerson 是一个全局变量,应该在不再需要时手动解除其引用,最后一行就是这么做的

PS:解除对一个值的引用并不会自动导致相关内存被回收,解除引用的关键在于确保相关的值已经不在上下文里了,因此在下次垃圾回收时会被回收

  1. 通过 let 和 const 提升性能

let 和 const都以块(而非函数)为作用域,所以相比于使用var,这两个可能会更早地让垃圾回收程序介入,尽早回收应该回收的内存


  1. 隐藏类和删除操作

根据 JavaScript 所在的运行环境,有时需要根据浏览器使用的引擎来采取不同的性能优化策略。Chrome使用 V8 Javascript 引擎,V8在将解释后的 JavaScript 代码编译为实际的机器码时会利用"隐藏类",这对代码性能有一定的影响

运行期间,V8会将创建的对象与隐藏类关联起来,以跟踪它们的属性特征,能够共享相同隐藏类的对象性能会更好,比如下面这段代码:
在这里插入图片描述
V8会在后台配置,让这两个类实例共享相同的隐藏类,因为这两个实例共享同一个构造函数和原型。假如之后添加a2.auther = 'Jake'这段代码,此时两个实例就会对应两个不同的隐藏类。根据这种操作的频率和隐藏类的大小,这可能对性能产生明显影响

解决方案就是避免 JavaScript 的"先创建再补充"式的动态属性赋值,并在构造函数中一次性声明所有属性
在这里插入图片描述
这样两个实例基本上就一样了(不考虑 hasOwnProperty 的返回值),因此可以共享一个隐藏类,从而带来潜在的性能提升。不过,使用 delete 关键字会导致生成相同的隐藏类片段
在这里插入图片描述
在代码结束后,即使两个实例使用了同一个构造函数,它们也不再共享一个隐藏类。动态删除属性与动态添加属性导致的后果是一样,最佳的做法是把不想要的属性设置为null,这样既可以保持隐藏类不变和继续共享,也能达到删除引用值供垃圾回收程序回收的效果


  1. 内存泄漏

JavaScript 中的内存泄漏大部分是由不合理的引用导致的
1)意外声明全局变量
没有使用任何关键字声明变量,解释器会把变量当作 window 的属性来创建,只要 window 本身不被清理就不会消失。只需要在变量声明前加上 var、let 或 const 关键字即可,这样变量就会在函数执行完毕后离开作用域

2)定时器
只要定时器一直运行,函数引用的变量就会一直占用内存,需要及时清除定时器

3)闭包
在这里插入图片描述
调用 outer() 会导致分配给 name 的内存被泄漏,只要返回的函数存在就不能清理name,因为闭包一直在引用着它。如果 name 的内容很大,那可能就是个大问题了


  1. 静态分配与对象池

为了提升性能,一个关键问题就是如何减少浏览器执行垃圾回收的次数。我们无法直接控制什么时候收集垃圾,但可以间接控制触发垃圾回收的条件。理论上,如果能够合理使用分配的内存,同时避免多余的垃圾回收,那就可以保住因释放内存而损失的性能

浏览器决定何时运行垃圾回收程序的一个标准是对象更替的速度。如果有很多对象被初始化,然后又一下子超出了作用域,浏览器就会采用更激进的方式调度垃圾回收程序运行,这样就会影响性能
以下是个计算二维矢量加法的函数:
在这里插入图片描述
调用这个函数时,会在堆上创建一个新对象,然后修改它,最后再把它返回给调用者。如果这个矢量对象的生命周期很短,那就会很快失去所有对它的引用,成为可以被回收的值。如果该函数被频繁调用,那么垃圾回收调度程序会发现这里对象更替的速度很快,从而就会更频繁安排垃圾回收

该问题的解决方案是不要动态创建矢量对象,比如修改上面的函数,让它使用一个已有的矢量对象:
在这里插入图片描述
这就需要在其他地方实例化矢量参数resultant,那在哪里创建矢量才不会让垃圾回收调度程序盯上呢?

一个策略是使用对象池。在初始化的某一时刻,可以创建一个对象池,用来管理一组可回收的对象。应用程序可以向这个对象池请求一个对象、设置其属性、使用它,在操作完成后再把它还给对象池。由于没发生对象初始化,垃圾回收探测就不会发现有对象更替

如果对象池只按需分配矢量(在对象不存在时创建新的,在对象存在时则复用存在的),那么这个实现本质是一种贪婪算法,有单调增长但为静态的内存。这个对象池必须使用某种结构维护所有对象,数组是比较好的选择,不过需要留意不要招致额外的垃圾回收
在这里插入图片描述
由于 JavaScript 数组的大小是动态可变的,引擎会删除大小为 100 的数组,再创建一个新的大小为 200 的数组。垃圾回收程序会看到这个删除操作,说不定会跑来收一次垃圾。要避免这种动态分配操作,可以在初始化时就创建一个大小够用的数组,不过必须事先想好这个数组有多大

PS:静态分配是优化的一种极端形式,如果应用程序被垃圾回收严重拖了后腿,可以利用它提升性能,但这种情况并不多见

JavaScript基础——变量作用域和内存 在实际开发中,充分利用好变量作用域和垃圾回收机制,可以写出更可靠、高效的JavaScript代码。在JavaScript编程中,了解变量的作用域和内存管理是非常重要的。变量作用域决定了变量的可访问性范围,而内存管理则关注变量的存储和释放。垃圾回收器定期检查堆内存中的对象,并回收不再使用的对象所占用的内存空间。在JavaScript中,有三种主要的变量作用域:全局作用域、函数作用域和块级作用域。在开发中,合理管理变量作用域和及时释放不再使用的对象,可以提高代码的可读性、性能和资源利用率。 阅读详情

相关推荐

网络虚拟化介绍(OVS、DVS)

网络虚拟化概念网络虚拟化就是把网络层的一些功能从硬件中剥离出来,建立新的网络虚拟层;该虚拟层可以接管网络服务和配置,实现网络服务与物理层的解耦,打破物理资源限制;通过网络虚拟层能够在一个物理网络上模拟出多个逻辑网络,并且多用户在逻辑网络上相互隔离,保证网络安全网络虚拟化的特点隔离性:不同租户的流量相互之间不能互访;但是IP/MAC地址都可以独立规划可移动性:虚拟机可以跨二层/三层迁移,甚至可以跨广域网迁移(迁移前后虚拟机Vlan和IP地址都不会发生变化)可扩展性:逻辑网络的规模和数量可扩展。

m0_49864110的博客 1万+

JavaScript(红宝书)(四)

js学习笔记

qq_53555672的博客 362

基于ROS2 Humble与Livox Mid-360的双雷达点云融合实战解析

本文详细解析了基于ROS2 Humble与Livox Mid-360的双雷达点云融合实战方案。从环境搭建、驱动安装、双雷达配置、外参标定、时间同步到点云融合核心实现,全面介绍了技术要点与避坑指南,并提供了工程化部署与性能优化建议,助力开发者高效实现高精度点云合成应用。

ss78901的博客 1093

JavaScript变量(五)作用域链增强和垃圾机制回收

一、作用域链增强 虽然执行上下文主要有全局上下文和函数上下文两种(eval()调用内部存在第三种上下文),但有 其他方式来增强作用域链。某些语句会导致在作用域链前端临时添加一个上下文,这个上下文在代码执 行后会被删除。通常在两种情况下会出现这个现象,即代码执行到下面任意一种情况时:  try/catch 语句的 catch 块  with 语句 这两种情况下,都会在作用域链前端添加一个变量对象。对 with 语句来说,会向作用域链前端添 加指定的对象;对 catch 语句而言,则会创建一个新的变量对象,

这里是前端,是不一样的前端 501

【python】import pandas as pd用法

是 Python 里最常用的数据分析库之一。 的意思是:导入 pandas 库,并给它起个别名 。这样用起来更简洁: 下面总结 pandas 的常见用法(配例子)。目录🔹 1. 数据结构(1) Series(一维数据,类似于数组 + 标签)(2) DataFrame(二维数据表,类似于 Excel 表格)🔹 2. 数据读写🔹 3. 数据查看🔹 4. 数据选择与索引🔹 5. 数据清洗🔹 6. 数据运算🔹 7. 数据筛选(布尔索引)🔹 8. 分组与聚合🔹 9. 排序 Pandas 常用方

2401_86285609的博客 1533

Vector CANoe VT2516A实战:从硬件连接到CAPL脚本的完整配置指南

本文详细介绍了Vector CANoe VT2516A板卡从硬件连接到CAPL脚本编写的完整配置指南。涵盖硬件接线原则、VT System配置避坑技巧、系统变量创建规范、可视化Panel设计、CAPL脚本调试及典型故障排查案例,帮助工程师快速掌握VT2516A板卡的应用实践,提升汽车电子测试效率。

weixin_30608503的博客 255

javascript基础学习系列三十四:作用域链增强

虽然执行上下文主要有全局上下文和函数上下文两种(eval()调用内部存在第三种上下文),但有 其他方式来增强作用域链。某些语句会导致在作用域链前端临时添加一个上下文,这个上下文在代码执 行后会被删除。with 语句将 location 对象作为上下文,因此 location 会被添加到作用域链前端。buildUrl()函数中定义了一个变量 qs。当 with 语句中的代码引用变量 href 时,实际上引用的是 location.href,也就是自己变量对象的属性。

wanmeijuhao的博客 456

Laser-Marking 激光振镜打标机的开源代码 - 下载 - 搜珍网

为了方便开发者的使用和定制化需求,我们在这里提供激光振镜打标机的开源代码,并附带详细的描述。首先,让我们来了解一下激光振镜打标机的基本原理。振镜系统由两个可移动的反射镜组成,可以控制激光束在水平和垂直方向上的偏转角度,从而实现对工件的精确控制。通过这段开源代码,开发者可以根据自己的需求对激光振镜打标机进行二次开发和定制化。你可以修改振镜角度、打标速度等参数,也可以添加其他功能,例如自动识别和追踪等。首先,我们创建了一个串口对象,用于与激光振镜打标机进行通信。函数实现了对用户输入文本的打标操作。

TechProX的博客 1279

js变量存储机制(栈、堆)

当进行出栈操作时,始终移除栈顶的元素,因此最后入栈的元素会最先被移除,而最先入栈的元素将最后被移除。需要注意的是,JavaScript 中的对象(Object)和数组(Array)不属于基本数据类型,而是属于引用类型。引用类型的值是可变的,可以修改其属性或元素。数字(Number):JavaScript 中的数字类型是基于 IEEE 754 标准的双精度浮点数表示,占用 8 个字节(64 位)的内存空间。运行效率高:由于栈内存的分配和释放是通过简单的指针操作实现的,所以它的分配和释放速度通常比堆内存更快。

qq_72023758的博客 1675

UG\NX二次开发 获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态

获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态。

王牌飞行员_里海的博客 1983

《YOLO多模态创新改进专栏目录 》全网独家创新,多模态融合改进教程,包含早期融合、中期融合、后期融合、损失函数改进、二次创新模块、独家创新等几百种创新点改进,答疑群提供完整项目,永久更新中

🔥《YOLO多模态创新改进专栏》重磅来袭!🚀 本专栏汇集最新顶会顶刊创新点,提供1000+篇YOLO多模态改进方案(涵盖v8-v26),包含: 多模态融合策略(早期/中期/后期) 损失函数优化 独家创新模块 详细改进步骤 ✨特色服务: ✔️ 配套完整可运行项目 ✔️ 专业答疑群支持(含非计算机专业指导) ✔️ 持续更新至2026年 ✔️ 适用目标检测/OBB/分割/分类等多任务 💡适合人群: 科研人员 | 研究生 | 需发SCI/CCF论文者 环境要求宽松,新手友好,助力快速产出科研成果! 📈早订优

Ai缝合怪、助力小伙伴高效发论文 749

Javascript基础——变量作用域和内存

Javascript基础——变量作用域和内存变量作用域和内存学习要点变量及作用域1.基本类型和引用类型的值2.动态属性3.复制变量值4.传递参数5.检测类型6.执行环境及作用域7.没有块级作用域内存问题 变量作用域和内存学习要点 JavaScript的变量与其他语言的变量有很大区别。 JavaScript变量是松散型的(不强制类型),其本质决定了它只是在特定时间用于保存特定值的一个名字而已。由于...

灿灿大王搭建的黄金屋 352

用 SAP XCO XLSX 模块优雅读 Excel:坐标、选择模式与实战案例全解析

SAP ABAP Cloud 中的 XCO XLSX 模块为 Excel 文件处理提供了官方解决方案。文章介绍了三个核心概念:通过 XCO_CP_XLSX=>DOCUMENT 获取文档句柄;使用 CL_XCO_XLSX_COORDINATE 坐标系统定位单元格;利用 Selection Pattern 精确读取数据区域。这些功能在 RAP 批量导入等业务场景中尤为实用,相比传统方案更加简洁可靠。文章还分享了真实项目中的最佳实践,如动态列定位和相对偏移技巧,帮助开发者构建更健壮的 Excel 导入逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 193

前端知识汇总【JS基础数据、变量、内存、对象、函数高级、作用域、闭包】

js学习笔记梳理,JS基础数据、变量、内存、对象、函数高级、作用域、闭包

qq_44810886的博客 329

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JS基础:变量 作用域 内存

摘要:主要对JS中的变量存储值类型,作用域,内存知识点做了详细梳理

2403_87844293的博客 1069

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

js基础——变量、作用域、内存

1、new关键字创建的是引用类型;eg. var box = new Object(); box.name = "Linda";//引用类型添加属性没问题 alert(box.name);2、基本类型添加属性会输出undefinedeg. var box = "Linda"; box.height = 185; alert(box.height);//undefined3...

weixin_33775582的博客 115

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

(二)JavaScript基础-基础概念(Object;函数;变量、作用域和内存问题;)

本文内容主要基于《JavaScript高级程序设计》(第3版),该书也断续的看过一遍,为便于进一步理解与基础知识的掌握,会增加一些个人的理解。

轮回的秋 275

JavaScript基础——变量、作用域和内存问题

JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值。 基本类型的值源自以下5种基本数据类型:Undefined、NuLL、Boolean、Number和String。 基本类型值和引用类型值具有以下特点: 1)基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中; 2)从一个变量向另一变量复制基本类型的值,会创建这个值的一个副本; 3)引用类型的值是对象,保存

bboyjoe的博客 556

javascript 基础笔记 变量、作用域、内存问题

一、变量 变量可以用来保存两种类型的值: 基本类型值和引用类型的值 1. 基本类型值具有以下特点 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中。一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本。 2. 引用类型的值具有以下特点 引用类型的值是对象,保存在堆内存中。包含引用类型值得变量实际上包含的并不是引用类型本身,而是一个指向该对象的指针。从

andyliu的专栏 885

JS(二):变量、作用域

一、复习 变量:可修改的保存数据的容器。 变量的命名:$ _ 字母 数字,只有数字不能开头,关键字保留字也不能开头。 jQuery:$.each(); underscore:_.each();//这也是一个js的函数库。 $ == jQuery; 区分大小写。 关键字:if,for等。 保留字:class等。 关于保留字及关键字的总结,可以参考文档资料 命名要有意义,单词,可以用下划线或驼峰法连接。 i/j/k用于计数循环。 -------- 变量的声明:两种方式。 第一种:通过var声明。(是大多数情

baidu_38730364的博客 248

JavaScript基础2——变量、作用域和内存

JS变量的本质介绍JS变量是松散类型的,它只是在特定时间用于保存特定值的一个名字。由于不存在定义某个变量要保存哪种数据类型的规则,因此,变量的值可及其数据类型可以在脚本的声明周期内改变。(这种规则虽然灵活,强大。可也就是因为这样埋下了一些乱乱的坑)数据类型的值既然数据类型有两种(基本类型和引用类型),那么JS有两种不同数据类型的值:基本类型值和引用类型值 基本数据类型值,是简单的数据段,

sqliang的专栏 420

js基础之--变量 作用域和内存问题

  基本类型:Undefind Null Boolean Number String   引用类型: 对象   在操作对象时,实际上实在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。   从一个变量向另一个变量赋值引用类型的值,同样也会将存储在对象中的值赋值一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象 ...

weixin_30788731的博客 67

javascript基础学习系列三十:变量、作用域与内存

JavaScript 中的变量可谓独树一帜。正如 ECMA-262 所规定的,JavaScript 变量是 松散类型的,而且变量不过就是特定时间点一个特定值的名称而已。由于没有规则定义变量必须包含什 么数据类型,变量的值和数据类型在脚本生命期内可以改变。这样的变量很有意思,很强大,当然也有 不少问题。本章会剖析错综复杂的变量。

m0_68635815的博客 355

javascript基础从小白到高手系列二十:变量、作用域与内存

在把一个值赋给变量时,JavaScript 引擎必须确定这个值是原始值还是引用值。在这个例子中,变量obj1 保存了一个新对象的实例。松散类型的,而且变量不过就是特定时间点一个特定值的名称而已。这个值之后,可以对这个值做什么,则大有不同。这里,首先创建了一个对象,并把它保存在变量person 中。别在于,这里复制的值实际上是一个指针,它指向存储在堆内存中的对象。注意 在很多语言中,字符串是使用对象表示的,因此被认为是引用类型。原始值和引用值的定义方式很类似,都是创建一个变量,然后给它赋一个值。

wanmeijuhao的博客 345

JavaScript基础学习笔记(三)——变量、作用域、内存

变量1. 数据类型 变量包含两种不同的数据类型值:基本类型值和引用类型值,基本类型值指简单的数据段,包含Undefined、Null、Boolean、Number、String五种,引用类型是保存在内存中的对象,不能直接操作它的内存空间。2. 变量复制 1)基本类型变量复制,两个变量相互独立,可以参与任何操作而不会受相互影响。 2)引用类型变量复制,两个变量引用同一个对象,改变其中一个变量,就

TsingM 465
上一篇: WebSocket | 背景 概念 原理 使用 优缺点及适用场景
下一篇: JavaScript基础 -- 迭代器与生成器
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值