JavaScript高级程序设计 第四章---变量 作用域 内存

本文深入探讨JavaScript中的变量类型,包括原始值和引用值的区别,重点讲解变量复制、参数传递以及确定类型的方法。接着,文章阐述了执行上下文与作用域的概念,分析了变量声明、作用域链以及标识符查找的过程。最后,详细讨论了JavaScript的垃圾回收机制,包括标记清理和引用计数策略,以及如何通过内存管理优化代码性能。
摘要由CSDN通过智能技术生成

第四章—变量 作用域 内存

关键字:变量 作用域 内存

本章内容

  • 通过变量使用原始值与引用值
  • 理解执行上下文
  • 理解垃圾回收

4.1 原始值与引用值

ECMAScript 变量可以包含两种不同类型的数据:原始值和引用值。原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。

保存原始值的变量按值访问,保存引用值的变量按引用访问

引用值是保存在内存中的对象,JavaScript 不允许直接访问内存位置,因此也就
不能直接操作对象所在的内存空间。在操作对象时,实际上操作的是对该对象的引用(reference)而非实际的对象本身。为此,保存引用值的变量是按引用(by
reference)访问的。

原始值不能有属性,尽管尝试给原始值添加属性不会报错,但无法使用。比如:

let name = "Nicholas";
name.age = 27;
console.log(name.age); // undefined

4.1.2变量复制

1. 原始值的变量复制:

两个变量可以独立使用,互不干扰

复制值,操作独立。

2. 引用值的变量复制

复制的值实际上是一个指针,它指向存储在堆内存中的对象。操作完成后,两个变量实际上指向同一个对象,因此一个对象上面的变化会在另一个对象上反映出来。

在这里插入图片描述
复制指针,操作会传递。

4.1.3 传递参数

ECMAScript 中所有函数的参数都是按值传递的,函数外的值会被复制到函数内部的参数中,就像从一个变量复制到另一个变量一样。

对于引用值的传递,例;

function setName(obj) {
   
obj.name = "Nicholas";
}
let person = new Object();
setName(person);
console.log(person.name); // "Nicholas"

在函数内部,obj 和person 都指向同一个对象。结果就是,即使对象是按值传进函数的,obj 也会通过引用访问对象。当函数内部给obj 设置了name 属性时,函数外部的对象也会反映这个变化,因为obj 指向的对象保存在全局作用域的堆内存上。

但并不是按照引用进行传递,例:

function setName(obj) {
   
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
let person = new Object();
setName(person);
console.log(person.name); // "Nicholas"

这个例子前后唯一的变化就是setName()中多了两行代码,将obj 重新定义为一个有着不同name的新对象。当person 传入setName()时,其name 属性被设置为"Nicholas"。
然后变量obj 被设置为一个新对象且name 属性被设置为"Greg"。如果person 是按引用传递的,那么person 应该自动将指针改为指向name 为"Greg"的对象。可是,当我们再次访问person.name 时,它的值是"Nicholas",这表明函数中参数的值改变之后,原始的引用仍然没变。
当obj 在函数内部被重写时,它变成了一个指向本地对象的指针。而那个本地对象在函数执行结束时就被销毁了。

总结:所有参数传递都是按值传递,会将函数外的值复制到函数内部。对于原始值的复制会直接复制值,与原变量独立,不会修改。对于引用值,就跟引用值的复制一样,复制的是指针,因此在函数中进行对应的修改会保存,但如果将储存地址的指针初始化为别的变量(如上面一个例子)则储存地址的指针消失了,不再指向原来的变量,接下来的修改就不会影响到原来的变量。 即按值进行传递,但按照引用去访问。

4.1.4 确定类型

typeof 操作符可以用来判断一个变量是否为原始类型。更确切地说,它是判断一
个变量是否为字符串、数值、布尔值或undefined 的最好方式。

let s = "Nicholas";
let b = true;
let i = 22;
let u;
let n = null;
let o 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值