Skip to content

JS解惑-undefined和null #17

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
sunmaobin opened this issue May 26, 2017 · 0 comments
Open

JS解惑-undefined和null #17

sunmaobin opened this issue May 26, 2017 · 0 comments
Assignees
Milestone

Comments

@sunmaobin
Copy link
Owner

undefinednull本质上没什么区别,只是用法上代表的含义不一样罢了。

前言

为什么说,undefinednull本质上没什么区别?

通过这个来看看:

undefined == null //true
null == undefined //true

另外,再阅读本文之前,建议大家先看看阮一峰老师的博客,以便了解下这二者的历史。

阮一峰 > undefined与null的区别

定义

  • null,表示一个“无”的对象;
  • undefined,表示一个“无”的原始值;

如何理解这2个定义?看看例子:

typeof(null) //object
typeof(undefined) //undefined

另外,二者转换为Number的结果也不一样。

Number(null) // 0
Number(undefined) //NAN

NAN,Not a Number,在IEEE浮点数算术标准(IEEE 754)中定义,表示一些特殊数值。
INF,Infinity的缩写,无穷大的意思,比如:1/0,结果就是Infinity

用途

说到这里大家可能就犯迷糊了,你一方面说没什么本质区别,另一方面通过定义又有区别,这让老夫如何是好?

好吧,接下来看看用途你大概就明白为什么Js这么定义二者了。

二者最大的用途不同在于 阶段不同

  • undefined,用于变量声明时;
  • null,用于变量赋值时;

我们知道变量的声明和赋值是2个不同阶段,只是有时候我们连起来写罢了,比如:

var name = 'night';

这里其实就是声明和赋值一起写了,拆分开来是这样:

var name; // 变量申明
name = 'night'; //变量赋值

好了,当您明白了这个逻辑有,再来看看上面说的二者迭代 阶段不同 是什么意思。

看看下面的两个例子,你可能就释然了:

var name;
console.log(name); //undefined
name = 'night';
console.log(name); //night
name = null;
console.log(name); //null

解释下上面的例子:

  • 先定义一个变量,如果变量未赋值,那么就是 undefined;
  • 如果赋值了,那么 undefined 的任务也就完成了;
  • 但如果赋值为一个 null,那么结果也就是 null 了;

说到这里,你可能又会问:“好端端的我赋值一个 null 作甚?”

好吧,你是一个充满好奇心的人,且听洒家慢慢道来。

关于Null

在Js中,你可以这么归类:“除了基本数据类型外,其余变量全部是对象”。

关于这句话解释下:

  • 基本数据类型,包括:undefined,null,number,string,boolean(个人觉得不应有object)
  • 所有的函数都可归结为对象(只不过创建对象的函数名遵循首字母要大写罢了)

如果按照这么分类,那么 null 的一个作用就凸显了。

给一个变量赋值,基本数据类型可以直接赋值,那么我要赋值一个对象,或者清空一个对象的赋值,该怎么办呢?

那就发面一个空的对象吧,即:null

当然变量被赋值为 null 后,还有另一层作用,那就是方便JS引擎对这个变量进行垃圾回收。

在JS中,凡是不用的变量,JS会定期清理掉。当我们把一个对象设置为 null 时,其实也就等于把这个对象标记为不用了,可以垃圾回收了。

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant