null 和 undefined 作为 JS 的两种基本类型,都表示「空」的状态,既然目的一致,那么为什么需要两个?

下面,我试着总结下两者的区别。
任何一门计算机语言,都要有表示变量状态为「空」的数据类型,比如说 java 的 null,python 的 None,而它们都只有这一种表示「空」的数据类型。
而 JS 却有两种...这若与直接其他语言进行数据交互时,就有可能出现问题:
var friend={
name: null,
age: undefined,
hobby: [null, 'reading', undefined]
};
JSON.stringify(friend); // {"name":null,"hobby":[null,"reading",null]}
从上可看出,在 JS 对象转 JSON 时, JSON.stringify() "聪明地"将两种为转为了一种,以便语言间的数据交互。
其两者的区别大致还有:
- undefined 通常为未赋值而产生的数据类型,其特性有:
- 已声明而未赋值的变量:
var a; // undefined
- 对象中未被赋值的属性:
var o = {};
o.a; // undefined
- 没有返回值的函数:
function f() {}
f(); // undefined
- undefined 若与 Number 类型进行计算,会隐式转换为 NaN:
Number(undefined); // NaN
undefined + 1 // NaN
- null 为变量特意赋值的数据类型,其用法通常和对象有关(甚至于 typeof null; -> "object" ... 说好的基本数据类型呢? 😂):
-
提前声明了变量,而要在未来某刻将其指向对象。
-
手动清内存:当全局变量对象不再需用时,需要将其赋为 null, 该对象才会被内存回收机制回收,以释放内存空间。
-
使用数据结构 -「字典」:因为 JS 语言的继承方式使用了「原型链」的设计模式,所以任意变量都天然拥有了原型链最顶层对象的方法:
原型链最顶层的对象,其拥有的方法被原型链下端的所有变量拥有
而当我们需要一个单纯存储数据而不需要任何“继承”的对象时,null 便派上了用场:
数据结构 - 「字典」
-
null 若与 Number 类型进行计算,会隐式转换为 0:
Number(null); // 0
null + 1 // 1
以上,便是我知道的 null 与 undefined 的区别。
欢迎交流,补充~
网友评论