美文网首页让前端飞
javascript之null和undefined的区别

javascript之null和undefined的区别

作者: 子龙0322 | 来源:发表于2018-11-23 12:01 被阅读2次

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


null vs undefined

下面,我试着总结下两者的区别。

任何一门计算机语言,都要有表示变量状态为「空」的数据类型,比如说 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() "聪明地"将两种为转为了一种,以便语言间的数据交互。

其两者的区别大致还有:
  1. undefined 通常为未赋值而产生的数据类型,其特性有:
  • 已声明而未赋值的变量:
var a; // undefined
  • 对象中未被赋值的属性:
var o = {};
o.a; // undefined
  • 没有返回值的函数:
function f() {}
f(); // undefined
  • undefined 若与 Number 类型进行计算,会隐式转换为 NaN:
Number(undefined); // NaN
undefined + 1 // NaN
  1. null 为变量特意赋值的数据类型,其用法通常和对象有关(甚至于 typeof null; -> "object" ... 说好的基本数据类型呢? 😂):
  • 提前声明了变量,而要在未来某刻将其指向对象。

  • 手动清内存:当全局变量对象不再需用时,需要将其赋为 null, 该对象才会被内存回收机制回收,以释放内存空间。

  • 使用数据结构 -「字典」:因为 JS 语言的继承方式使用了「原型链」的设计模式,所以任意变量都天然拥有了原型链最顶层对象的方法:


    原型链最顶层的对象,其拥有的方法被原型链下端的所有变量拥有

    而当我们需要一个单纯存储数据而不需要任何“继承”的对象时,null 便派上了用场:


    数据结构 - 「字典」
  • null 若与 Number 类型进行计算,会隐式转换为 0:

Number(null); // 0
null + 1 // 1



以上,便是我知道的 null 与 undefined 的区别。
欢迎交流,补充~

相关文章

网友评论

    本文标题:javascript之null和undefined的区别

    本文链接:https://www.haomeiwen.com/subject/qdzdqqtx.html