第3章 变量 第1节 基本类型和引用类型的值
JS栈内存和堆内存
简单说明
JavaScript中的变量分为基本类型和引用类型
(1)基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问
(2)引用类型是保存在堆内存中的对象,值大小不固定,栈内存中存放的该对象的访问地址指向堆内存中的对象,JavaScript不允许直接访问堆内存中的位置,因此操作对象时,实际操作对象的引用
代码与存储图
let s1010 = 12; // 栈内存
let s1009 = "test"; // 栈内存
let s1008 = null; // 栈内存
let s1007 = undefined; // 栈内存
let s1006 = true; // 栈内存
let arr1 = [1, 2, 3]; // 变量arr1存在于栈中,[1, 2, 3]作为对象存在于堆中
let obj2 = {a: 1}; // 变量arr2存在于栈中,{a: 1}作为对象存在于堆中
说明:
原始值,存在栈内存stack,并且不可改变值
引用值,值指针存在栈内存 值存在堆内存
访问堆内存中的数据类型步骤:
(1)从栈中获取该对象的地址引用
(2)再从堆内存中取得我们需要的数据
基本类型赋值行为
let a = 20;
let b = a;
b = 30;
console.log(a); // 20
引用类型赋值行为
let arr1 = [1, 2, 3];
let arr2 = arr1;
arr1.push(4);
console.log(arr1, arr2); // [1, 2, 3, 4] [1, 2, 3, 4]
let obj = {a: 1};
let obj2 = obj;
obj2.a = 2;
console.log(obj.a); // 2
对比总结:
栈内存 | 堆内存 |
---|---|
存储基础数据类型 | 存储引用数据类型 |
按值访问 | 按引用访问 |
存储的值大小固定 | 存储的值大小不定,可动态调整 |
由系统自动分配内存空间 | 由代码进行指定分配 |
空间小,运算效率高 | 空间大,运行效率相对较低 |
先进后出,后进先出 | 无序存储,可根据引用直接获取 |
可以解释:《JavaScript高级程序设计第三版》章节
4.1.1 动态的属性
1.基本类型存储为具体值,不能添加属性。而引用类型存储的是一个指针,指着的对象,类似数据结构中的树等类型,动态添加一个树枝,可以执行。
4.1.2 复制变量值
1.基本类型复制时候,是值的复制,引用类型因为存的是地址值,复制的时候,复制的也就是地址值。
4.1.3 传递参数
ECMAscript中所有函数的参数都是按值传递的。
function setName(obj) {
obj.name = '张三';
obj = new Object();
obj.name = '李四';
}
var person = new Object();
setName(person);
alert(person.name); //'张三'//如果是按引用传递,函数内对name修改,就应该反映到外部person变量,但没有。
说明:这里函数内部重写了obj时,这个变量引用的就是一个局部对象了,而这个局部对象会在函数执行完毕后销毁。
也就是:即使在函数体内对参数做了修改,但原始的引用保持不变。这就是值传递的结果
4.1.4 检测类型
var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
alert(typeof s);
alert(typeof i);
alert(typeof b);
alert(typeof u);
alert(typeof n);
alert(typeof o);
// 输出结果
//string
//number
//boolean
//undefined
//object
//object
注意:null也理解成,在数据结构中经常是指针指向null节点,所以null存储是理解为存的是指针,指针就是引用类型,对象。
typeof是检测基本数据类型的好帮手,但是对于引用类型变量,我们应该使用instanceof方法:
alert(person instanceof Object);
alert(colors instanceof Array);
alert(pattern instanceof RegExp);
当然,如果用instance来检测基本类型,则始终会返回false。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?