关于JavaScript中通过slice()函数复制而来的数组与原数组用或=比较返回false这件事
在讲明白这个问题之前需要先搞清楚一些基本问题
1.两种不同的内存分配方式
栈内存
一般代码逻辑,简单变量和结构体都是放在栈中
堆内存
对象,以及被装箱的数据放在堆中
2.JavaScript中的基本类型和引用类型
基本类型
基本的数据类型有:`undefined,boolean,number,string,null.
有以下几个特点:
- 基本类型的变量是存放在栈内存的
- 基本类型的访问是按值访问的
- 基本类型的值是不可变的
- 基本类型的比较是值的比较
引用类型
引用的数据类型有:object,array,regexp,date,function.
有以下几个特点:
- 引用类型的值是保存在堆内存中的对象(Object)
- 引用类型的值是按引用访问的
- 引用类型的值是可变的
- 引用类型的比较是引用的比较
3.比较的底层逻辑
对于引用类型,其比较是引用的比较,通过slice()函数复制而来的数组与原数组看起来值一样,但是 js 要去判断他们是不是同一份数据,也就是要去查他们引用的内存地址是否一致,而每一次声明一个新的变量都会开一块新的内存地址空间,引用的内存地址显然不一样所以会返回false,这里仅仅是以数组作为距离,对于所有的引用类型都适用
var a = {};
var b = {};
a === b // false
对于基本类型,其比较是值的比较,因此只需要保证值与数据类型一样,其比较的结果就为true
var a = 10;
var b = 10;
a === b //true
需要注意的是对于如下情况:
var xiaoming1 = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
var xiaoming2 = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
var a=xiaoming1===xiaoming2;
var b=xiaoming1.weight===xiaoming2.weight;
console.log(a);//false
console.log(b);//true
对于引用类型中的对象是 fasle, 但是其中的基本类型 weight 可以是 true
如有错误欢迎指正,一起进步!