一、 基本数据类型概述
在js这门强大而灵活的编程语言中,存在着多种基本数据类型,它们共同构成了 程序运行的基础。其中,主要的基本数据类型包括:String(字符串类型)、Number(数字类型)、Boolean(布尔类型)、null、undefined 以及 BigInt。在这些基本数据类型中,null 和 undefined 都具有特殊的含义,它们在一定程度上都传达了 “无” 这一概念。通常情况下,在大多数场景中,null 和 undefined 表现出的行为非常相似,以至于人们常常难以区分它们之间的差异。
二、null 与 undefined 的相似之处
全局变量与全局对象:当在全局作用域中定义两个变量,一个赋值为 null,另一个赋值为 undefined 时,有趣的现象发生了。例如:
var a = null;
var b = undefined;
console.log(global.a, global.b); // undefined undefined
通过这个例子可以看出,虽然变量 a 被赋值为 null,但在全局对象中查找时,它显示为 undefined。这明确地表明,null 并不是全局对象的一个属性。然而,undefined 却似乎自然地成为了全局对象的一部分,即使变量 b 只是简单地被声明而未明确赋值。
在条件判断中的表现:在 的条件判断语句中,null 和 undefined 都会被视为 false。比如:
var a = null;
var b = undefined;
if (!a) {
console.log(a); // null
}
if (!b) {
console.log(b); // undefined
}
这意味着,在具有类型转换的场景中,null 和 undefined 都会被转化为 false。进一步验证这一点,可以通过使用双重否定运算符(!!)来查看它们的布尔值:
console.log(!!null); // false
console.log(!!undefined); // false
相等性判断:当使用 “==” 进行判断时,null 和 undefined 的结果为 true。这是因为在这种情况下,它们都被转化为了布尔值的 false。这一行为是由 的规范所决定的,即 null 和 undefined 被认为是相等的。但需要注意的是,不能仅仅用转换数据类型来解释这种相等性。例如:
console.log(null == undefined); // true
而当使用 “===” 进行严格相等判断时,由于它们属于不同的数据类型,结果会直接返回 false。这体现了严格相等判断对数据类型的严格要求:
console.log(null === undefined); // false
三、null 与 undefined 的不同点
null 的含义及经典用法:
null 表示一个值被定义了,但定义的是空值。例如,在函数参数中,null 可以用来表示不传入此参数。以下是一个具体的例子:
const test = (a, b) => {
console.log(b);
};
test(null, 2); // 2
此外,null 还作为原型链的终点。可以通过以下代码来验证:
console.log(Object.prototype.__proto__); // null
undefined 的含义及经典用法:
undefined 表示根本不存在定义。以下是一些典型的使用场景:
当变量被声明,但还没有赋值时,此时的变量等于 undefined。例如:
let a;
console.log(a); // undefined
在调用函数时,如果应该传入的参数未传入,则该参数为 undefined。例如:
const test = a => {
console.log(a);
};
test(); // undefined
对于对象来说,如果没有定义的属性,该属性为 undefined。例如:
const obj = {};
console.log(obj.a); // undefined
需要注意的是,在未定义的属性上继续读取属性会报错。例如:
console.log(obj.a.b); // TypeError: Cannot read property 'b' of undefined
对于数组而言,如果访问不在索引范围的值,该值为 undefined。例如:
const arr = [1];
console.log(arr[100]); // undefined
当函数没有返回值时,默认返回的是 undefined。例如:
const test = () => {};
console.log(test()); // undefined