第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。

posted @ 2022-04-06 23:53  szmtjs10  阅读(22)  评论(0编辑  收藏  举报