前言
在之前我对于null
和undefined
了解就是,用typeof
操作符,null
会返回 'object'
、 undefined
会返回 'undefined'
、两者都是 JS 中的基本数据类型、两者被转化为布尔值时,都是 false、使用 == 进行比较时为 true、使用 === 进行比较时为 false,并没有进行一个系统的总结,现在特意写一篇文章,希望大家看完这篇文章可以对二者有更深层次的理解。
接下来,让我们弄清楚二者之间的区别。
定义
1. null
null
是一种基本数据类型,用于表示空值或者不存在的对象,即"no object"
。我们可以将其视为一种特殊的占位符,表示一个变量或者对象不持有任何值,所以它通常用于初始化一个变量,以表明这个变量目前不指向任何特定的对象。
换句话说,当我们说一个变量是 null
,我们是在明确地指出它目前没有被赋予任何对象的引用,它是一个尚未与任何对象建立联系的初始状态。
2. undefined
undefined
也是一种特殊的基本数据类型,用来表示一个变量已经创建,但是尚未被赋予具体的值,即"no value"
。表示一个变量最原始的状态,相当于一个标记,用来指出变量存在但尚未定义其内容。这就与undefined
不同了,undefined
表示变量尚未被赋值,而null
表示变量已经被赋值为空。
什么时候出现null什么时候出现undefined 🔥🔥🔥
我们先来几个场景看看:
这里我们只是定义了一个变量a
,没有给它赋值,根据undefined
表示no value
,我们自然而然就能明白它就是undefined
,它表达了这个a
,将来可能是任意的值,但它现在的状态就是没有值的。
再看这个场景,我们直接使用了一个对象中不存在的属性,它得到的结果也是 undefined
,它表达这个属性目前是没有值的,将来 js 可以动态为对象添加属性,所以这属性也可能是任意的值。
接下来,来看看 null
。
null
表达的是 no object
,无对象,所以null
的设计天生就和对象相关联。在这场景中document.getElementById()
应该得到一个dom对象,当不存在这个对象的时候,表达的就是无对象,所以是 null
。
null
天生就和对象相关联,这点在我们使用 typeof
操作符也能体现。
这个"误判"也是 JavaScript 作者承认的一个缺陷。在 JavaScript 的早期实现中,值以 32位 存储,前 3位 表示数据类型的标记,其余位则表示值。在对象的内部表示中,类型标记通常是以一系列零开始的。而 null
被用来表示空值,类似于 C 语言中的空指针,它的内部表示为全零(即 32 位都是 0),所以也正是 null
的类型标记与对象的类型标记相同,typeof
操作符将 null
错误地识别为一个对象。
总的来说,null
和 undefined
都表示空,主要区别在于 undefined
表示尚未初始化的变量的值,而 null
表示该变量有意缺少对象指向。清楚了这个我们就能知道在开发中什么时候使用 null
,什么时候使用 undefined
。
总结 🌸🌸🌸
null:
- 初始化空引用 :当你创建一个变量,并且你清楚地知道当前不应该指向任何对象或值时,你可以将这个变量设置为
null
。比如,你声明了一个用于稍后存放数据库连接的对象,但在建立连接之前,你可以先将它设置为null
。 - 清空对象引用 :如果你有一个对象引用,但你希望删除这个引用,可以将它设置为
null
。 - 函数返回值 :在函数中,如果你需要表示"没有返回任何有意义的值",可以使用
null
作为返回值。 - 占位符 :在某些情况下,
null
可以作为占位符,直到你有了实际的值可以放入。
undefined:
- 未初始化的变量 :当你声明一个变量但还没有给它赋值时,这个变量的值默认是
undefined
。 - 函数没有返回值 :如果你的函数没有使用
return
语句返回任何值,或者return
语句没有指定任何值,函数的返回值就是undefined
。 - 属性不存在 :当你尝试访问一个对象的属性,而这个属性在对象中不存在时,你得到的是
undefined
。 - 参数未提供 :如果一个函数的参数没有被调用时提供,那么这个参数的值是
undefined
。
看到这里,恭喜你对于null
和undefined
有了更深层次的了解,最后祝你也祝我在今后日子里能够登高望远,心向彼岸。