JS undefined和null的区别
在 JavaScript 中,数据类型可以分为基本数据类型和引用数据类型,其中基本数据类型包括 Undefined、Null、Boolean、Number、String 5 种,在 ES6 中新增了一种新的基本数据类型 Symbol。
下面是 4 种常见的出现 undefined 的场景:
下面是 3 种常见的出现 null 的场景:
Undefined 类型
Undefined 类型只有一个唯一的字面值 undefined,表示的是一个变量不存在。下面是 4 种常见的出现 undefined 的场景:
- 使用只声明而未初始化的变量时,会返回“undefined”。
var a; console.log(a); // undefined
- 获取一个对象的某个不存在的属性(自身属性和原型链继承属性)时,会返回“undefined”。
var obj = { name: 'kingx' }; console.log(obj.address); // undefined
- 函数没有明确的返回值时,却在其他地方使用了返回值,会返回“undefined”。
function foo() {} console.log(foo()); // undefined
- 函数定义时使用了多个形式参数(后文简称为形参),而在调用时传递的参数的数量少于形参数量,那么未匹配上的参数就为“undefined”。
function foo(param1, param2, param3) { console.log(param3); } foo(1, 2); // undefined
Null 类型
Null 类型只有一个唯一的字面值 null,表示一个空指针对象,这也是在使用 typeof 运算符检测 null 值时会返回“object”的原因。下面是 3 种常见的出现 null 的场景:
- 一般情况下,如果声明的变量是为了以后保存某个值,则应该在声明时就将其赋值为“null”。
var returnObj = null; function foo() { return { name: 'kingx' }; } returnObj = foo();
- JavaScript 在获取 DOM 元素时,如果没有获取到指定的元素对象,就会返回“null”。
document.querySelector('#id'); // null
- 在使用正则表达式进行捕获时,如果没有捕获结果,就会返回“null”。
'test'.match(/a/); // null
Undefined 和 Null 两种类型的异同
Undefined 和 Null 虽然是两种不同的基本数据类型,存在一些不同的特性,但是在某些表现上存在着相同之处,这里就总结了 Undefined 和 Null 的相同点和不同点。相同点:
- Undefined 和 Null 两种数据类型都只有一个字面值,分别是 undefined 和 null。
- Undefined 类型和 Null 类型在转换为 Boolean 类型的值时,都会转换为 false。所以通过非运算符(!)获取结果为 true 的变量时,无法判断其值为undefined还是null。
- 在需要将两者转换成对象时,都会抛出一个 TypeError 的异常,也就是平时最常见的引用异常。
var a; var b = null; console.log(a.name); // Cannot read property 'name' of undefined console.log(b.name); // Cannot read property 'name' of null上面代码表示在通过某个变量引用 name 属性时,若该变量值实际为 undefined 或者 null,就会抛出异常。
- Undefined 类型派生自 Null 类型,所以在非严格相等的情况下,两者是相等的,如下面代码所示。
null == undefined; // true
不同点:
- null 是 JavaScript 中的关键字,而 undefined 是 JavaScript 中的一个全局变量,即挂载在 window 对象上的一个变量,并不是关键字。
- 在使用 typeof 运算符检测时,Undefined 类型的值会返回“undefined”,而 Null 类型的值会返回“object”。
typeof undefined; // undefined typeof null; // object
- 在通过 call 调用 toString() 函数时,Undefined 类型的值会返回“[objectUndefined]”,而 Null 类型的值会返回“[object Null]”。
Object.prototype.toString.call(undefined); // [object Undefined] Object.prototype.toString.call(null); // [object Null]
- 在需要进行字符串类型的转换时,null 会转换为字符串"null",而 undefined 会转换为字符串"undefined"。
undefined + ' string'; // undefined string null + ' string'; // null string
- 在需要进行数值类型的转换时,undefined 会转换为 NaN,无法参与计算;null 会转换为 0,可以参与计算。
undefined + 0; // NaN null + 0; // 0
- 无论在什么情况下都没有必要将一个变量显式设置为 undefined。如果需要定义某个变量来保存将来要使用的对象,应该将其初始化为 null。这样不仅能将 null 作为空对象指针的惯例,还有助于区分 null 和 undefined。
关注公众号「站长严长生」,在手机上阅读所有教程,随时随地都能学习。本公众号由站长亲自运营,长期更新,坚持原创,持续分享创业故事+学习历程+工作记录+生活日常+编程资料。
微信扫码关注公众号