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

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

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

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

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

堆内存

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

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

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

有以下几个特点:

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

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

有以下几个特点:

  1. 引用类型的值是保存在堆内存中的对象(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

如有错误欢迎指正,一起进步!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值