javascript 中null和undefined区分和比较


Posted in Javascript onApril 19, 2017

javascript 中null和undefined区分和比较

Undefined类型

Undefined 类型只有一个值,即特殊 undefined 。在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefined ,

例如:

var message;
alert(message == undefined); //true

这个例子只声明了变量 message ,但未对其进行初始化。比较这个变量与 undefined 字面量,结果表明它们是相等的。这个例子与下面的例子是等价的:

var message = undefined;
alert(message == undefined); //true

这个例子使用 undefined 值显式初始化了变量message 。但我们没有必要这么做,因为未经初始化的值默认就会取得 undefined 值。

一般而言,不存在需要显式地把一个变量设置为undefined 值的情况。字面值 undefined 的主要目的是用于比较,而ECMA-262第3版之前的版本中并没有规定这个值。第3版引入这个值是为了正式区分空对象指针与未经初始化的变量。

不过,包含 undefined 值的变量与尚未定义的变量还是不一样的。看看下面这个例子:

var message; // 这个变量声明之后默认取得了undefined值
// 下面这个变量并没有声明
// var age  
alert(message);  // "undefined"
alert(age);  // 产生错误

运行以上代码,第一个警告框会显示变量message 的值,即 “undefined” 。而第二个警告框——由于传递给 alert() 函数的是尚未声明的变量age ——则会导致一个错误。对于尚未声明过的变量,只能执行一项操作,即使用 typeof 操作符检测其数据类型(对未经声明的变量调用delete 不会导致错误,但这样做没什么实际意义,而且在严格模式下确实会导致错误)。

然而,令人困惑的是:对未初始化的变量执行typeof 操作符会返回 undefined 值,而对未声明的变量执行typeof操作符同样也会返回undefined值。来看下面的例子:

var message; // 这个变量声明之后默认取得了undefined值
// 下面这个变量并没有声明 
// var age
alert(typeof message);  // "undefined" 
alert(typeof age);  // "undefined"

结果表明,对未初始化和未声明的变量执行 typeof 操作符都返回了 undefined 值;这个结果有 其逻辑上的合理性。因为虽然这两种变量从技术角度看有本质区别,但实际上无论对哪种变量也不可能执行真正的操作。

提示:

即便未初始化的变量会自动被赋予undefined值,但显式地初始化变量依然是明智的选择。如果能够做到这一点,那么当typeof操作符返回”undefined”值时,我们就知道被检测的变量还没有被声明,而不是尚未初始化。

Null类型

Null 类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看, null 值表示一个 空对象指针 ,而这也正是使用 typeof 操作符检测 null 值时会返回 “object” 的原因,如下面的例子所示:

var car = null;
 alert(typeof car);  // "object"

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值。这样一来,只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用,如下面的例子所示:

if (car != null){
// 对car对象执行某些操作
}
实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true:
alert(null == undefined);  //true

这里,位于 null 和 undefined 之间的相等操作符(==)总是返回 true ,不过要注意的是,这个操作符出于比较的目的会转换其操作数,尽管null 和 undefined 有这样的关系,但它们的用途完全不同。如前所述,无论在什么情况下都没有必要把一个变量的值显式地设置为 undefined,可是同样的规则对 null 却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存 null 值。这样做不仅可以体现null 作为空对象指针的惯例,而且也有助于进一步区分 null 和 undefined。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
Prototype1.6 JS 官方下载地址
Nov 30 Javascript
jquery异步循环获取功能实现代码
Sep 19 Javascript
JS正则中的RegExp对象对象
Nov 07 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
Jan 23 Javascript
jquery $.trim()方法使用介绍
May 21 Javascript
javascript操纵OGNL标签示例代码
Jun 16 Javascript
Node.JS利用PhantomJs抓取网页入门教程
May 19 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
Feb 01 Javascript
AngularJS ui-router刷新子页面路由的方法
Jul 23 Javascript
webuploader实现上传图片到服务器功能
Aug 16 Javascript
Vue创建头部组件示例代码详解
Oct 23 Javascript
ES6 Promise对象的含义和基本用法分析
Jun 14 Javascript
jQuery Plupload上传插件的使用
Apr 19 #jQuery
Vuex之理解Mutations的用法实例
Apr 19 #Javascript
Vuex之理解Getters的用法实例
Apr 19 #Javascript
Vuex之理解state的用法实例
Apr 19 #Javascript
微信小程序 聊天室简单实现
Apr 19 #Javascript
Vuex之理解Store的用法
Apr 19 #Javascript
微信小程序 判断手机号的实现代码
Apr 19 #Javascript
You might like
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
浅谈jquery上下滑动的注意事项
2016/10/13 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
vue.js实现备忘录功能的方法
2017/07/10 Javascript
Vue下的国际化处理方法
2017/12/18 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
深入理解Python中的内置常量
2017/05/20 Python
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
windows下python和pip安装教程
2018/05/25 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
python字典的值可以修改吗
2020/06/29 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
什么是设计模式
2012/06/17 面试题
村优秀党员事迹材料
2014/01/15 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
60句有关成长的名言
2019/09/04 职场文书
一篇文章带你复习java知识点
2021/06/28 Java/Android
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js