数据类型
数据类型 | 含义 |
---|
Number | 数值 |
String | 字符串 |
Boolean | 布尔值 |
Undefined | 未定义 |
Null | 空 |
Symbol | 符号(ES6新增) |
数据类型 | 含义 |
---|
Array | 数组 |
Object | 对象 |
Function | 函数 |
内存空间
- 我们的存储空间分为两种 栈和堆
- 栈:主要储存基本数据类型的内容
- 堆:主要存储复杂数据类型的内容
栈数据结构
- 栈中存取数据的方式与这种乒乓球的存放方式如出一辙。
- 处于盒子中最顶层的乒乓球5,它一定是最后被放进去,但可以最先被使用。
- 而我们想要使用底层的乒乓球1,就必须将上面的4个乒乓球取出来,让乒乓球1处于盒子顶层
- 直接在栈空间内存储一个数据
- var num = 100;,在内存中存储的情况
堆数据结构
- 堆数据结构是一种树状结构,它的存取数据的方式,则与书架与书非常相似
书虽然也整齐的存放在书架上,但是我们只要知道书的名字,就可以很方便的取出我们想要的书,
而不用像从乒乓球盒子里取乒乓一样,非得将上面的所有乒乓球拿出来才能取到中间的某一个乒乓球。
好比在JSON格式的数据中,我们存储的key-value是可以无序的,因为顺序的不同并不影响我们的使用,我们只需要关心书的名字。
- 在
堆内存
里面开辟一个存储空间 - 把数据存储到存储空间内
- 把存储空间的
地址
赋值给栈内存
里面的变量 - 也就是说
栈内存
存的是它的地址不是值
var obj = {
name: 'jack',
age: 18,
gender: "男";
}
堆和栈比较
- 我们只能直接访问
栈内存
里面的内容 - 如果你想访问一个对象里面的成员
- 因为对象本身在
堆内存
里面 - 我们就要利用
栈内存
里面的地址
,找到堆内存里面的数据存储空间 - 然后访问内部里面的成员
var obj = {
name: "Jack",
age: 18
}
console.log(name);
console.log(obj.name);
基本数据类型
- 基本数据类型是值之间的比较
- 直接比较存在栈空间里面的值即可
var num = 1;
var str = '1';
console.log(num==str);
- 赋值就是把变量存储的值直接赋值给另一个变量
- 赋值过后的两个变量就没有关系了
var a = 10;
var b = a;
a = 20;
console.log(a);
console.log(b);
复杂数据类型
- 复杂数据类型是地址之间的比较
- 因为栈空间里面的变量存储的是它的地址
var obj1 = {name: 'jack'};
var obj2 = {name: 'jack'};
console.log(obj1==obj2);
- 在上面我们创建了两个对象,那么就会在
堆空间
里面开辟两个存储空间存储数据(两个地址) - 虽然储存的内容是一样的,那么也是两个储存空间,两个地址
- 复杂数据类型之间就是地址的比较,所以
obj1
和obj2
两个变量的地址不一样 - 所以我们得到的就是
false
- 赋值的时候,实际上就是把一个变量的地址给了另一个变量
- 赋值过后,两个变量操作一个空间
var obj = {
name: "Jack",
age: 18
}
var newObj = obj;
obj.age = 19;
console.log(obj.age);
console.log(newObj.age);
- 看不懂?没关系,打个比方:
- 复杂数据类型存储的地方看做是一个房子
- 而在栈空间存的是打开这个房子的钥匙
newObj = obj
不是说newObj新买了个房子- 而是相当于 obj 把钥匙复制了一份给了 newObj
- 房子还是那个房子,并没有变
- 然后
newObj
就能进去这个房子里面,把电视砸了 - 等
obj
进去的时候就会发现电视是坏的