JavaScript中的小疑惑|青训营笔记

54 阅读2分钟

关于JavaScript中通过slice()函数复制而来的数组与原数组用==或===比较返回false这件事

这是我参与「第四届青训营」笔记创作活动的第3天。

在讲明白这个问题之前需要先搞清楚一些基本问题

1.两种不同的内存分配方式

栈内存

一般代码逻辑,简单变量和结构体都是放在栈中

栈内存中存放的地址指向堆内存中的对象

堆内存

对象,以及被装箱的数据放在堆中

2.JavaScript中的基本类型和引用类型

基本类型

基本的数据类型有:`undefined,boolean,number,string,null.

有以下几个特点:

  1. 基本类型的变量是存放在栈区的(栈区指内存里的栈内存)
  2. 基本类型的访问是按值访问的
  3. 基本类型的值是不可变的
  4. 基本类型的比较是值的比较
引用类型

引用的数据类型有:object,array,regexp,date,function.

有以下几个特点:

  1. 引用类型的值是保存在堆内存(Heap)中的对象(Object)
  2. 引用类型的值是按引用访问的
  3. 引用类型的值是可变的
  4. 引用类型的比较是引用的比较

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