​null(深入探究:null 和 undefined 究竟有何区别?)

null(深入探究:null 和 undefined 究竟有何区别?)

简单区分

总的来说

null

undefined

都代表空,主要区别在于

undefined

表示尚未初始化的变量的值,而

null

表示该变量有意缺少对象指向。

undefined

这个变量从根本上就没有定义

隐藏式 空值

null

这个值虽然定义了,但它并未指向任何内存中的对象

声明式 空值

MDN 中给出的定义

null

null

是一个字面量,不像

undefined

,它不是全局对象的一个属性。

null

是表示缺少的标识,指示变量未指向任何对象。把

null

作为尚未创建的对象,也许更好理解。在 API 中,

null

常在返回类型应是一个对象,但没有关联的值的地方使用。

undefined

undefined

全局对象

的一个属性。也就是说,它是全局作用域的一个变量。

undefined

的最初值就是原始数据类型

undefined

一张神奇的图片

接下来我们看一张比较经典的图片,该图来自 stackoverflow 的回答,本人没有找到准确的出处。

表现形式

在更深入理解

null

undefined

的区别前,我们首先要知道

null

undefined

JS

中有什么不同的表现形式,用以方便我们更好的理解

null

undefined

的区别。

typeof

typeofnull//'object'typeofundefined//'undefined'

Object.prototype.toString.call

typeofnull//'[objectNull]'typeofundefined//'[objectUndefined]'

== 与 ===

null==undefined//truenull===undefined//false!!null===!!undefined//true

Object.getPrototypeOf(Object.prototype)

JavaScript

中第一个对象的原型指向

null

Object.getPrototypeOf(Object.prototype)//null

+ 运算 与 Number()

leta=undefined+1//NaNletb=null+1//1Number(undefined)//NaNNumber(null)//0

JSON

JSON.stringify({a:undefined})//'{}'JSON.stringify({b:null})//'{b:null}'JSON.stringify({a:undefined,b:null})//'{b:null}'

let undefiend = 'test'

functiontest(n){letundefined='test' returnn===undefined} test()//falsetest(undefined)//falsetest('test')//tureletundefined='test'//UncaughtSyntaxError:Identifier'undefined'hasalreadybeendeclared

深入探索

为什么 typeof null 是 object?

typeof null

输出为

'object'

其实是一个底层的错误,但直到现阶段都无法被修复。

原因是,在

JavaScript

初始版本中,值以

32位

存储。前

3位

表示数据类型的标记,其余位则是值。

对于所有的对象,它的前

3位

都以

000

作为类型标记位。在

JavaScript

早期版本中,

null

被认为是一个特殊的值,用来对应

C

中的

空指针

。但

JavaScript

中没有

C

中的指针,所以

null

意味着什么都没有或者

void

并以

全0(32个)

表示。

因此每当

JavaScript

读取

null

时,它前端的

3位

将它视为

对象类型

,这也是为什么

typeof null

返回

'object'

的原因。

为什么 Object.prototype.toString.call(null) 输出 '[object Null]'

toString()

Object

的原型方法,调用该方法,默认返回当前对象的

[[Class]]

。这是一个内部属性,其格式为

[object Xxx]

,其中

Xxx

就是对象的类型。

JavaScript 万物皆对象,为什么 xxx.toString() 不能返回变量类型?

这是因为 各个类中重写了

toString

的方法,因此需要调用

Object

中的

toString

方法,必须使用

toString.call()

的方式调用。

对于

Object

对象,直接调用

toString()

就能返回

'[object Object]'

。而对于其他对象,则需要通过

call / apply

来调用才能返回正确的类型信息。

为什么 == 和 === 对比会出现 true 和 false ?

很多文章说:

undefined

的布尔值是

false

null

的布尔值也是

false

,所以它们在比较时都转化为了

false

,所以

undefined == null

。实际上并不是这样的。

ECMA

11.9.3

章节中明确告诉我们:

If

x

is

null

and

y

is

undefined

, return

true

.

If

x

is

undefined

and

y

is

null

, return

true

.

这是

JavaScript

底层的内容了,至于更深入的内容,如果有兴趣可以扒一扒

JavaScript

的源码。

为什么null + 1和undefined + 1表现不同?

这涉及到

JavaScript

中的隐式类型转换,在执行

加法运算

前,隐士类型转换会尝试将表达式中的变量转换为

number

类型。如:

'1' + 1

会得到结果

11

null

转化为

number

时,会转换成

0

undefined

转换为

number

时,会转换为

NaN

至于为什么执行如此的转换方式,我猜测是

JavaScript

早期的一个糟糕设计。

从语言学的角度来看:

null

意味着一个明确的没有指向的空值,而

undefined

则意味着一个未知的值。在某种程度上,

0

意味着数字空值。这虽然看起来有些牵强,但是我在这一阶段能所最能想到的可能了。

为什么 JSON.stringify 会将值为 undefined 的内容删除?

其实这条没有很好的解释方式,

JSON

会将

undefined

对应的 key 删除,这是

JSON

自身的转换原则。

undefined

的情况下,有无该条数据是没有区别的,因为他们在表现形式上并无不同:

letobj1={a:undefined}letobj2={}console.log(obj1.a)//undefinedconsole.log(obj2.a)//undefined

但需要注意的是,你可能在调用接口时,需要对

JSON

格式的数据中的

undefied

进行特殊处理。

为什么 let undefiend = 'test' 可以覆盖掉 JavaScript 自身的 undefined?

JavaScript

对于

undefined

的限制方式为全局创建了一个只读的

undefined

,但是并没有彻底禁止局部

undefined

变量的定义。

据说在

JavaScript

高版本禁止了该操作,但我没有准确的依据。

请在任何时候,都不要进行

undefined

变量的覆盖,就算是你的

JSON

转换将

undefined

转换为

''

。也不要通过该操作进行,这将是及其危险的行为。

总结

关于使用 undefined 还是 null

这是一条公说公有理婆说婆有理的争议内容。本人更倾向于使用

null

,因为这是显示定义空值的方式。我并不能给出准确的理由。

但关于使用

undefined

我有一条建议:如果你需要使用

undefined

定义空值,请不要采取以下两种方式:

let a;

let a = undefined;

进而采取下面这种方式显式声明

undefined

let a = void 0;

结语

终于将

undefined

null

的基本区别搞定了。

相关推荐

​广东省好的大学和专业(广东有什么好大学)

​广东省好的大学和专业(广东有什么好大学)

151

广东省好的大学和专业(广东有什么好大学) 随着2025年高考的临近,考生们正如火如荼地备战高考中,进行着考前最后一轮的冲刺。 在高考成绩未出来之前,一切都是未知的,正是凭...

​山海经中实力最强的人物(山海经最强的是谁)

​山海经中实力最强的人物(山海经最强的是谁)

160

山海经中实力最强的人物(山海经最强的是谁) 如果想系统地了解咱们的上古神话,那么《山海经》是不可不读的一部神话典籍。 跟一般的神话小说、古代典籍不同,《山海经》的叙...

​钩弋夫人人物简介(她低估了男人的智商)

​钩弋夫人人物简介(她低估了男人的智商)

181

钩弋夫人人物简介(她低估了男人的智商) 汉武帝很焦虑。 这个雄才大略、纵横捭阖的伟大帝王,在打败了国内外一切对手,杀死一切可能危及自己江山的人后,陷入了前所未有的孤...

​轰6系列轰炸机排名(仅凭一机之力)

​轰6系列轰炸机排名(仅凭一机之力)

195

轰6系列轰炸机排名(仅凭一机之力) 世界上拥有战略轰炸机的国家是哪些?,我来为大家科普一下关于轰6系列轰炸机排名?下面希望有你要的答案,我们一起来看看吧! 轰6系列轰炸机排...

最具观赏性的水虎鱼(傻头傻脑身材短小)

最具观赏性的水虎鱼(傻头傻脑身材短小)

176

最具观赏性的水虎鱼(傻头傻脑身材短小) 经常被钓鱼人错认为棒花鱼, 自带吸盘,可以像磁铁一样吸附于石头上而避免被水冲走 。身材短小,仅有几厘米长,但却是鱼类中最大的家...

​幼子继承制,中国古代继承制度的意义?

​幼子继承制,中国古代继承制度的意义?

93

幼子继承制,中国古代继承制度的意义? 中国古代继承制度的意义 浅议中国封建社会的皇位继承制度 皇位继承制度是中国封建社会世袭君主制的核心,是以血缘关系为纽带维系君主专...

什么是国家公园(5个国家公园有哪些)

什么是国家公园(5个国家公园有哪些)

79

什么是国家公园(5个国家公园有哪些) 目前,全国有200多处国家认证的风景名胜区,其中有5个近期被选为了“中国国家公园”,分别是武夷山、海南热带雨林、东北虎豹、大熊猫和三...

​两性jiao往,一个女人忘不了你,有4种表现

​两性jiao往,一个女人忘不了你,有4种表现

177

两性jiao往,一个女人忘不了你,有4种表现 一般来说女生都是比较重感情的,可能在分手之后很难从这份感情当中抽离出来。但是相比男生来说就不一定了,可能放弃这段感情之后,男...

​葡萄酒恒温酒柜多少度(恒温酒柜多少度合适)

​葡萄酒恒温酒柜多少度(恒温酒柜多少度合适)

72

葡萄酒恒温酒柜多少度(恒温酒柜多少度合适) 葡萄酒恒温酒柜多少度最合适?葡萄酒恒温酒柜是什么?葡萄酒恒温酒柜有什么优势?下面一起来看看吧!!在炎热的夏季,很多人都喜欢...

​四大名著都是哪个朝代著作的?

​四大名著都是哪个朝代著作的?

84

四大名著都是哪个朝代著作的? 中国四大名著就算你没看过小说,应该也看过相关的影视剧。今天就为大家讲讲四大名著分别是在哪些朝代著作的,还有四大名著的回目有哪些讲究。四...

​国缘四开多少钱一箱(国缘四开多少钱)

​国缘四开多少钱一箱(国缘四开多少钱)

61

国缘四开多少钱一箱(国缘四开多少钱) 国缘四开多少钱一箱?“这是近日一位消费者在苏宁易购平台购买一箱海参时提出的疑问。据了解,海参价格一直居高不下,不少消费者为了买到...

​扶余旅游景点攻略

​扶余旅游景点攻略

83

扶余旅游景点攻略 本文将为您带来关于扶余旅游景点哪里最好皇姑坟景区怎么样的信息,并探索与之相关的扶余公园介绍知识点。 请记得关注本站,让我们开始吧! 文章: 1、德惠旅...

​酿之参 价格 中国参王价格

​酿之参 价格 中国参王价格

90

酿之参 价格 中国参王价格 酿之参 价格昂贵,一般人难以消费得起。所以,我们在日常生活中,要尽量少吃或不吃这种食物。 一:中华参价格 为减少不良反应,服用人参应该采用“顿...

​中煤平朔集团有限公司

90

中煤平朔集团有限公司 中煤平朔集团有限公司 成立于1982年,隶属于中国中煤能源集团有限公司,是一家以煤炭生产为主的企业。公司位于山西省,拥有安太堡、安家岭等特大型露天矿...