利用Memory工具理解JS数据类型

149 阅读2分钟

在JS中,数据类型划分为两种

  • 基本数据类型(原始数据类型)

Number、String、Boolean、Null、Undefined、Symbol(ES6新增)

特点:

1. 值传递

把一个原始数据类型的值赋给另一个变量时,实际上是复制了该值。也就是说,两个变量是完全独立的

var a = 10 ;
var b = a ; //b现在是 10
b = 20 ;
console.log(a,b); //  b 现在是 20a 仍然是 10

image.png

2. 一旦创建,值不可变

let a = 10;
a = 20; // 这里不是修改了 a 的值,而是创建了一个新的值 20 并赋给了 a

a 最初的值是 10。当你执行 a = 20 时,实际上是在内存中创建了一个新的值 20,然后把这个新值赋给了 a。原来的 10 仍然存在于内存中,只是 a 不再指向它了。

 

3. 占用内存空间小

Devtools 的 Memory工具查看基本数据类型的内存地址,a复制给b,看到两个地址不一样,ab是相互独立的

image.png

附操作步骤

写好html页面

image.png

浏览器加载页面,打开控制台,选择memory,左上角按钮录制

image.png

在window对象下找,内容有点多需要慢慢找

image.png  

  • 引用数据类型( 复杂类型,合成类型(由多个原始类型合成))

Object(在JS中除了基本数据类型以外的都是对象,数据是对象,函数是对象,正则表达式是对象)

特点:

1. 引用传递

把一个引用数据类型的值赋给另一个变量时,实际上是复制了该值的引用(即内存地址)。因此,两个变量指向同一个内存地址,修改其中一个变量会影响另一个变量。

var obj1 = new Object({
  name: "我没有名字",
 });
var obj2 = obj1;
console.log(obj1.name, obj2.name); //我没有名字 我没有名字
obj2.name = "我有名字了";
console.log(obj1.name, obj2.name); //我有名字了 我有名字了

image.png  

2. 可变

let obj = { name: "Alice" };
obj.name = "Bob"; // 这里是直接修改了 obj 的属性

实际上是在内存中修改了 obj 对象的 name 属性。原来的 obj 对象被改变了,而不是创建了一个新的对象

 

3. 占用内存比基本类型大

Devtools 的 Memory工具查看引用类型的内存地址,obj1和obj2的地址都是82013

  image.png

 

 

延伸

  1. 字符串存在字符串常量池中
  2. string,和new String 占用的内存大小有区别

参考juejin.cn/post/705144…

image.png

参考

juejin.cn/post/699246…