【JavaScript】为什么 [] ==[] 为 false,[] == ![] 为 true

举报
LongYorke 发表于 2021/02/15 22:59:44 2021/02/15
【摘要】 要解释上述问题就需要了解什么是基本类型值和引用类型值

要解释上述问题就需要了解什么是基本类型值和引用类型值

基本类型值、引用类型值:

ECMAScript变量包含两种不同类型的值:基本类型值、引用类型值。

基本类型值包括:String,Number,Boolean,undefined,null。那么其他就属于引用类型的值,上面的数组[]自然就是引用类型。
(记忆方式NnuBBS牛逼死,其中一个B为BigNumber
最常用到的引用类型包括Object,Array,Function等等...
(记忆方式AO噢fuck法克)

两种类型访问方式的区别:

1.基本类型的比较是值,值相等就相等。变量是存在栈里面的,举个栗子:
let name = "LongYorke";
let weight = 130;

那么它的储存结构是这样的:

栈里包括了变量名称与变量的值。

2.引用类型可以添加属性,也可以删除属性。对象和数组就是最典型的栗子:
//对象
let personObj = {};
person.name = "LongYorke";
person.weight = "130";
//数组
var personArr = [];
personArr.push("LongYorke");
personArr.push("LiHua");

引用类型的值是同时保存在栈内存和堆内存中的,那么它的储存结构是这样的:

引用类型时按引用访问的,也就是比较两个对象的堆内存中的地址是否相同,从上图可以看出来,地址不相同。
所以,为什么 [] == [] 为 false,就能理解了,因为数组是引用类型的值,是按引用访问的,但是两个对象看似相等,但引用类型要比较堆内存中的地址是否相同。



[] == [] 为 false:

[]相当于声明了两个不同的数组,而数组是引用类型的值,引用的是地址,比较的是内存中存的是否是同一个对象,虽然都是两个空数组,但是引用地址不一样,结果当然为false。


[] == ![] 为 true:

这个就要说到 == 的比较规则,最后都是转换成 Number 来比较的。
右侧![]:
1.![],该表达式中单目运算最先进行 即 对空数组进行隐式转换为Boolean true,非运算为false
(如果我们想将某个类型转为Boolean类型,除了使用.Boolean()方法外,还可以在前放置!!来实现
2.接下来 ToNumber(false), 即 0。
所以 0 == 0,[] == ![] 为 true。

左侧[]:
1.数组不是基本类型,需要先 ToPrimitive([])转换成原始类型, 即 ""。
2.接下来 ToNumber(""), 即 0。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200