在JS中,数据类型划分为两种
-
基本数据类型(原始数据类型)
Number、String、Boolean、Null、Undefined、Symbol(ES6新增)
特点:
1. 值传递
把一个原始数据类型的值赋给另一个变量时,实际上是复制了该值。也就是说,两个变量是完全独立的
var a = 10 ;
var b = a ; //b现在是 10
b = 20 ;
console.log(a,b); // b 现在是 20,a 仍然是 10
2. 一旦创建,值不可变
let a = 10;
a = 20; // 这里不是修改了 a 的值,而是创建了一个新的值 20 并赋给了 a
a 最初的值是 10。当你执行 a = 20 时,实际上是在内存中创建了一个新的值 20,然后把这个新值赋给了 a。原来的 10 仍然存在于内存中,只是 a 不再指向它了。
3. 占用内存空间小
Devtools 的 Memory工具查看基本数据类型的内存地址,a复制给b,看到两个地址不一样,ab是相互独立的
附操作步骤
写好html页面
浏览器加载页面,打开控制台,选择memory,左上角按钮录制
在window对象下找,内容有点多需要慢慢找
-
引用数据类型( 复杂类型,合成类型(由多个原始类型合成))
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); //我有名字了 我有名字了
2. 可变
let obj = { name: "Alice" };
obj.name = "Bob"; // 这里是直接修改了 obj 的属性
实际上是在内存中修改了 obj 对象的 name 属性。原来的 obj 对象被改变了,而不是创建了一个新的对象
3. 占用内存比基本类型大
Devtools 的 Memory工具查看引用类型的内存地址,obj1和obj2的地址都是82013
延伸
- 字符串存在字符串常量池中
- string,和new String 占用的内存大小有区别