当前位置: 首页 > news >正文

JavaScript 中 ==、===、Object.is 以及 null、undefined、undeclared 的区别

文章目录

  • 1.在JavaScript 当中,`==` 和 `===` 与Object.is()的区别
    • 1.1 ==松散比较(loose equality)
    • 1.2 严格比较(strict equality)
    • 1.3 Object.is同值比较(same-value equality)
  • 2.JavaScript null、undefined 与undeclared 的区别?
    • 2.1 undefined 与null 的区别 ?
    • 2.2 undefined 与undeclared 的区别 ?

1.在JavaScript 当中,=====与Object.is()的区别

在JavaScript 当中有许多可以比较相等与否的方法。其中最常见的三个分别是**===(严格比较)==(松散比较),以及Object.is(同值比较)**。

1.1 ==松散比较(loose equality)

==在比较两个值之前,会先强制转换数据类型,变成两者可以比较的形式。

如下示例:

console.log(1=="1");// trueconsole.log(0==false);// trueconsole.log(undefined==null);// true

因为会强制转换型别,==会带给开发者一些困扰。因此多数的情况,不建议使用==

1.2 严格比较(strict equality)

===不会强制转换型别与值,所以如果是不同型别,比较两者会回传false。不同值的话一样会回传false,===的 JS 设计初衷是判断数值是否相同。

不过有两个情况例外:

  • 当我们比较+0-0时,严格比较会回传true
  • 以及比较NaNNaN会是false。而这两个状况则是同值比较Object.is派上用场的时候。
+0===-0;// trueNaN===NaN;// false

1.3 Object.is同值比较(same-value equality)

同值比较顾名思义是在比较两个值是不是相等。虽然它是Object 开头,但比较的可以是任意的两个值。例如:

console.log(Object.is(1,1));// trueconsole.log(Object.is(1,"1"));// false

上面提到的两种在===时遇到的问题,可以透过Object.is有效分辨

console.log(Object.is(+0,-0));// falseconsole.log(Object.is(NaN,NaN));// true

=== +0 和-0 是 true,是因为比较的是值,就是 0 这个值,而不关心他的方向,Object.is 关心了他了方向,因为方向是不同的,所以 object.is 是false。

===中的两个NaN 的比较,NaN 是一种失败状态,Not a Number,但是失败的原因是可能是不同的,所以= ==中是 false。但是在 object.is语义中,规定了所有的 NaN 都表示一种值状态,所以是 true。

不过如果要有效分辨NaN,在JavaScript 有一个方法叫isNaN是可以使用的。假如对于Object.is感到陌生,可以选择用Number.isNaN

2.JavaScript null、undefined 与undeclared 的区别?

2.1 undefined 与null 的区别 ?

undefined表示还未定义值,所以当一个变数被宣告但还未被赋予任何值之前,这个变数就会是undefined,可以理解为「尚未」。

null代表的是一个变数的空值,可以理解为「没有」

undefinednull在JavaScript 中,都是属于原始数据类型(primitive data types) 之一,也就像任何其他数据类型(data types),例如:stringnumber一样,可以被赋予在变数上。两者在使用上,两者会有不同的意义。

举例来说,当前端要向后端索取数据时,因为需要等待数据回传,所以某个变数一开始可能是undefined,当数据回来时,就会变成该数据类型。以下面的例子来说,我们有个变量users,定义它的类型为

UserDTO[]|undefined

而不是

UserDTO[]|null

正是因为在拿到资料前,users是「尚未」。

type UserDTO={id:string,firstName:string,lastName:string,profilePicture:string|null,};constusers:UserDTO[]|undefined=awaitfetchUsers();

反之亦然,上面的例子中,当拿到了users,有些使用者没有照片,因为是「没有」,所以profilePicture的类型是

profilePicture:string|null;

而不是

profilePicture:string|undefined;

2.2 undefined 与undeclared 的区别 ?

undefined:已经声明了,但还没值

undeclared:压根没声明过,JS 根本不知道它是谁

leta;console.log(a);// undefinedtypeofa;// "undefined" 合法,不报错
console.log(b);ReferenceError:b is not defined//undeclared 是一种代码错误状态
http://www.jsqmd.com/news/217473/

相关文章:

  • “全球大模型第一股”诞生!智谱AI登陆港股
  • C#被评为2025年度编程语言!
  • 基站定位中 RSSI 误用的系统性问题分析
  • 2026年,“交互”会出现新的定义
  • 注意,科学家、数学家不一定是智能学家
  • 移动网络信号指标与单位整理(2G/3G/4G/5G Android vs IoT)
  • 综合能源系统中基于电转气和碳捕集系统的热电联产建模与优化研究(Matlab代码实现)
  • 【确认出席】叶光辉 盐城市住房公积金管理中心技术信息处副处长丨上海·1月14日
  • 解读具身智能系统任务生命周期与认知闭环的关系
  • 救命神器2026 TOP10 AI论文工具:本科生毕业论文写作全攻略
  • Python纪念币预约自动化:零基础也能轻松搞定
  • 工厂定位手环从核心架构、功能亮点、适用场景与选型建议详解
  • 全网最全9个AI论文软件,助本科生轻松搞定毕业论文!
  • 风电的Weibull分布及光电的Beta分布组合研究(Matlab代码实现)
  • Gerber文件解析利器gerbv:PCB制造验证的专业解决方案
  • NS-USBLoader终极攻略:Switch文件传输与系统引导全解析
  • 基于混沌系统和DNA编码的彩色数字图像加密、解密、抗噪声性能分析以及抗裁剪性能分析(Matlab代码实现)
  • Python纪念币预约自动化终极指南:零基础实现智能抢购
  • 【确认出席】鲜翾 金赛药业人工智能药物研究院院长丨上海·1月14日
  • Soundflower音频路由技术深度解析:重塑macOS音频生态的虚拟设备方案
  • Linux build:头文件安装
  • Soundflower音频路由神器:彻底释放Mac音频系统的无限潜能
  • WE Learn智能学习助手终极指南:5步开启高效学习新时代
  • WE Learn AI学习助手终极指南:5步轻松开启智能学习模式
  • 基于遗传算法和粒子群算法的潮流计算比较(Matlab代码实现)
  • [特殊字符]_内存管理深度解析:如何避免GC导致的性能陷阱[20260108161913]
  • 性价比高的海外代理IP:怎么选不踩坑
  • 汽车焊接工艺参数优化的方法和案例
  • 巴菲特-芒格的神经形态计算投资:类脑计算的未来
  • 【无人机】基于遗传算法混合粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)