JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

时间:2022-08-13 20:07:19

  null、NaN、undefined三者的区别是什么?

  在初次接触到JavaScript的时候,傻傻的分不清null、NaN、undefined三者到底区别何在,在实际的项目开发中也因为这个问题而困惑久矣。针对这个问题,我特意查找了多方资料,在笔记本上做了详细的分析记录,但是由于纸质资料不便于携带、不便于后期查看。所以特此将笔记搬至博客园上,如有表述不正确的地方,希望大家能够给予意见,谢谢!

  1.数据类型

   ECMAScript中定义了5中简单的数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和 String。

  2.Undefined

  undefined是一个表示“无”的原始值或者表示“缺少值”,就是此处应该有一个值,但是未定义。当场尝试读取时就会返回undefined;例如变量被声明了但是没有赋值,就等于undefined。请看下边两个例子:

JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

  JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

  这个例子只是声明了变量,但是未对其进行初始化。比较这个变量与undefined字面量,结果返回未true,表明他们是相等的。

  再看这个例子:

JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

  这个例子将值undefined初始化了变量message,实际上等价于上述第一个例子的效果。但是我们根本不需要做这样子的操作,因为未经过定义的值默认就会取得undefined值,在这里进行这样的操作只是为了向大家详细地进行基础知识点的讲解以便于更好的理解。不过,包含undefined的值和尚未定义的变量还是不一样的。请看下边这个例子:

JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

  运行上述代码就会发现,第一个弹框就会显示message的值“undefined”,而运行第二个alert弹框时,控制台会报错:'age' is not defined。但是如果用typeof分别检测声明了的变量和未声明的变量,结果竟然都是“undefined”,来看看下边这个例子:

JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

  

  结果表明。对未初始化和未声明的变量执行typeof操作符否反悔了undefined的值。

  3.Null

  Null表示一个空对象指针,换句话说,就是一个对象被定义了,但是值为“空值”,当用typeof操作符检测null值时,返回“objec”的原因也归咎于此。如下面的例子所示:

JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

    

  实际上undefined值时派生自null值的,所以他们的对等性能测试返回的是true:

JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

  但是需要注意的是,对等性能测试虽然返回的是true,但无论在什么情况下都没有必要把一个变量的值显示设置为undefined,可是同样的规则对于null则不适用。换句话说,只要意在保存对象的变量还没有真正的保存对象,就应该明确地让该变量保存null值。这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和nudefined。在自我学习的过程中,关于null让我感受最深的地方就是在闭包的应用中。大家都知道,闭包在给我们开发带来方便的同时,也埋下了一些隐患,比如内存消耗,内存泄漏的问题,那么如何解决这个问题呢?在闭包使用结束后释放掉闭包里的东西就可以了。那到底如何来释放呢?此时,我们就需要手动设置函数的引用为null,这也是我认为可以体现null作用的一点。

  4.NaN

  NaN(Not a number)表示的是尝试将一个非number的字面量、变量或者表达式转换为数字的时候返回的值。

  该值有两个特点,一是任何涉及NaN的操作都会返回NaN,比如NaN/10;二是NaN与任何值都不相等,包括NaN本身。

  因此,ECMAScript定义了isNaN()函数。该函数只接受一个任意类型参数。isNaN()在接收到一个值之后,会尝试将这个值转化为数值,那么此时就有两种情况,如果传入的参数是一些不是数值的值,那么就会被转化为数值,比如字符串“100”或Blooean值;如果传入的是参数是一些不能被转化为数值的值都会导致这个函数返回true。请看下边的例子:

JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

  

  上述例子分别测试了5个不同的值。第一个测试的是NaN自身,那么必然返回的结果是true;第二个测试的是数值100,本来100就是数字,那么必然返回的结果是false;第三个测试的是字符串“100”,字符串“100”可以被转换为数字100,那么那么必然返回的结果是false;第四个测试的是非数字的字符串,该字符串不能被转换为数字,那么必然返回的结果就是true;最后一个测试的是Boolean,因为在Boolean中,true被转换为数字1,false被转换为数值0.那么必然返回的结果是false。

  5.总结

  在详细地分析完三种数据类型之后,现在我们来做一个总结:

  a. null表示一个对象被定义了,值为“空值”;

  b. undefined表示当一个变量已经申明,但是为赋值时返回的值;如果是未声明的变量直接带入表达式,则会产生未定义的报错;

  c. NaN表示的是尝试将非number的字面量、变量和表达式转换为数字的时候返回的值;

  d. 注意:在验证null时, 一定要使用===, 因为==无法分别null和undefined。