从JavaScript中+!{}[true]输出1讲起 [] 、!{}与 {}的比较

本文深入探讨了JavaScript中数组、空对象以及类型转换的关系,通过实例分析了[] == []为何为false,[] == ![]为何为true,并解释了+!{}[true]输出1的原因,揭示了JavaScript中相等运算符背后的逻辑和类型转换规则。
摘要由CSDN通过智能技术生成

主要讲述[] {} 以及 JavaScript中的类型转换

主要参考文章(非常推荐):https://segmentfault.com/a/1190000008432611#articleHeader1

首先看一些示例:

[]==[]   //false

[]==![]   //true

{}==!{}   //false

{}==![]   //VM1896:1 Uncaught SyntaxError: Unexpected token ==

![]=={}   //false

[]==!{}   //true

undefined==null   //true

1.[] == [] 为什么是false?

有点js基础应该知道对象是引用类型,就会一眼看出来[] == []会输出false,因为左边的[]和右边的[]看起来长的一样,但是他们引用的地址并不同,所以返回false。

我们可以学习下JavaScript中内存空间的概念,可以参考:https://www.jianshu.com/p/996671d4dcc4

在这里插入图片描述

简单类型都放在栈(stack)里
对象类型都放在堆(heap)里

var a = 20;
var b = 'abc';
var c = true;
var d = { m: 20 }//地址假设为0x0012ff7c
var e = { m: 20 }//重新开辟一段内存空间假设为0x0012ff8f
console.log(e==d);//false

那为什么引用值要放在堆中,而原始值要放在栈中,不都是在内存中吗,为什么不放在一起呢?

function Person(id,name,age){
    this.id = id;
    this.name = name;
    this.age = age;
}
var num = 10;
var bol = true;
var str = "abc";
var obj = new Object();
var arr = ['a','b','c'];
var person = new Person(100,"笨蛋的座右铭",25);  

然后我们来看一下内存分析图:

在这里插入图片描述

变量num,bol,str为基本数据类型,它们的值,直接存放在栈中,obj,person,arr为复合数据类型,他们的引用变量存储在栈中,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值