1.栈和堆
栈是自动分配的内存空间,它由系统对象自动释放,而堆则是动态分配的内存,大小也不一定会自动释放。
2.数据类型
- 基本数据类型:null undefined string number boolean symbol
- 引用数据类型:object(对象)
3.基本数据类型(存放在栈中)
1.基本数据类型存放在栈中,访问的时候是按值进行访问的,基本类型的值是不可变的
[JavaScript] 纯文本查看 复制代码 var a = 10;
var b = a;
b = 20;
console.log(a);//10
console.log(b);//20
2.基本类型的比较是它们的值的比较
[JavaScript] 纯文本查看 复制代码 var c = 1;
var d = true;
console.log(Boolean(1));//true
console.log(c == d); // true
console.log(c === d); //
- == 两个等号进行比较时会进行隐式转换,将类型也转换为相同
- === 判断类型和值是否相等
- js中有6个值为(0 、’’ 、null、undefined、fals、NaN) 为false
- 其他包括({} 、[] 、Infinity)都是true
[JavaScript] 纯文本查看 复制代码 console.log(Boolean(0)); //false
console.log(Boolean('')); //false
console.log(Boolean(null)); //false
console.log(Boolean(NaN)); //false
console.log(Boolean(undefined)); //false
console.log(Boolean(false)); //false
console.log(Boolean({})); //true
console.log(Boolean([])); //true
console.log(Boolean(Infinity)); //true
4.引用类型1.引用类型的值按引用访问的,引用类型的值是可变的
[JavaScript] 纯文本查看 复制代码 var obj = {
name: 'zyj'
};
obj.name = 'bbbb';
obj.age = 20;
console.log(obj.name); //bbbb
[JavaScript] 纯文本查看 复制代码 var b = {};
var c = b;
c.name = '张三';
console.log(b.name); //张三
console.log(c.name); //张三
- 此处是将b对象复制给c对象,同时是将b的标识符和引用地址都复制了一份给c对象,这个时候,b对象和c对象的引用地址指向的是同一个堆内存对象,所以当给c对象添加了一个属性时,b对象所指向的堆内存对象也拥有了name属性
- 具体如图所示
2.引用类型的值的比较是引用的比较
[JavaScript] 纯文本查看 复制代码 var a = {};
var b = {};
console.log(a == b); //false
console.log(a === b); //false
虽然此处两个都是空对象,但是进行比较的时候得到的结果却是不相等,这是因为引用类型的值在内存中是这样存储的,在栈中存放标识符(即a、b)和引用地址(指针),在堆中存放对象,通过栈中的的指针(引用地址)可以找到存在堆内存中的对象。
上面例子中,因为两个对象的引用地址分别存在不同的栈内存中,同时指向的也是不同的堆内存中的对象,所以无论是松散相等还是严格相等去判断这个两个空对象,它们都是不相等的。
如下图所示
|