null、undefined、NaN的区别。它们之间的隐式转换和全等结果又是什么?

前言

在 JavaScript 中,null、undefined 和 NaN 是三种不同的特殊值,它们在使用时有着不同的含义和用途。而我们在做项目时候,常常与它们打交道。

因此,在编写 JavaScript 代码时需要了解它们之间的区别和相互之间的隐式转换,以避免产生错误或不可预料的行为。比如:

1. 在使用 if 语句进行条件判断时,没有考虑到 undefined 可能隐式转换为 false。

let foo;
if (foo) {
  console.log("This should not be executed");
}

在这个例子中,由于 foo 的值为 undefined,因此 if 语句会将其隐式转换为 false,从而不执行其中的代码。如果忘记了这种隐式转换,就可能导致逻辑上的错误。

2. 在进行数学运算时,没有考虑到 NaN 的影响。

let bar = "hello";
console.log(bar - 1); // NaN
console.log(typeof (bar - 1)); // number

在这个例子中,由于将一个字符串减去一个数字会产生 NaN,因此 bar - 1 的结果就是 NaN。如果没有考虑到 NaN 的影响,就可能导致无效的计算结果或不可预测的行为。

3.在进行对象属性访问时,没有考虑到某个属性的值可能为 undefined。

let baz = {};
console.log(baz.prop); // undefined
console.log(baz.prop.foo.bar); // TypeError: Cannot read property 'foo' of undefined

在这个例子中,由于 baz 对象中不存在名为 prop 的属性,因此访问 baz.prop 会返回 undefined。然而,再次访问 undefined.prop.foo.bar 就会导致 TypeError 错误。如果没有考虑到这种情况,就可能导致运行时错误。

一、null

null 表示一个空对象指针。当一个变量被赋值为 null 时,它表示一个空对象引用,并且 typeof 运算符会返回 "object"。

let foo = null;
console.log(foo); // null
console.log(typeof foo); // object

二、undefined

undefined 表示一个未定义的值。当一个变量被声明但没有被赋值时,它的值为 undefined。同时,函数没有返回值时也会返回 undefined。typeof 运算符会返回 "undefined"。

let bar;
console.log(bar); // undefined
console.log(typeof bar); // undefined

function baz() {}
console.log(baz()); // undefined

三、NaN

NaN 表示不是数字的值。当进行无效的数学操作或将非数字字符串转换为数字时,会返回 NaN。NaN 与任何值(包括它自己)都不相等。

console.log(0 / 0); // NaN
console.log("hello" - 1); // NaN
console.log(NaN == NaN); // false

NaN 与任何值(包括它自己)都不相等这里可能有人不能理解。NaN和NaN明明长得一样,为什么不相等呢?可以从它的定义去理解“不是数字的值”表示这个值仅仅不是数字,可以是除数字外的任何值,既然是任何值了,两个不是数字的任何值,自然不相等。

四、==和===的情况

在 JavaScript 中,null、undefined 和 NaN 之间的相等比较是一个比较微妙的问题。由于它们的含义和类型都不同,因此它们之间的相等比较有时可能会产生出人意料的结果。

  • ==的特殊情况

1. null 和 undefined

特别注意:null 和 undefined 相等比较时,它们会相等!这是因为在 JavaScript 中,它们被认为是相同类型的“空值”。

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

2. NaN

NaN 和任何值,包括 NaN 自身,在相等比较时都不相等。这是因为 NaN 表示不是数字的值,它与任何值的比较结果都为 false。

console.log(NaN == NaN); // false
console.log(NaN == 0); // false
console.log(NaN == "hello"); // false

需要注意的是,虽然 NaN 与任何值比较的结果都为 false,但在使用 isNaN() 函数时,它会将传入的值转换为数字后再进行比较。

console.log(isNaN(NaN)); // true  NaN转为数字是NaN
console.log(isNaN("hello")); // true  字符串转化为数字是NaN
console.log(isNaN(undefined)); // true  undefined转化为数字是NaN,因为 undefined 表示一个未定义的值,在转换为数字时没有明确的意义
console.log(isNaN(null)); // false  null转化为数字是0
  • ===的特殊情况

ull、undefined 和 NaN 是不同的类型,在严格相等比较(===)时会被认为是不相等的。同时,与 NaN 进行严格相等比较时,无论与哪个值比较都会返回 false,因为 NaN 是唯一不等于自身的值。

console.log(null === undefined); // false
console.log(null === null); // true
console.log(undefined === undefined); // true
console.log(NaN === null); // false
console.log(NaN === undefined); // false
console.log(NaN === NaN); // false

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值