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 相关文章推荐
跟着JQuery API学Jquery 之三 筛选
Apr 09 Javascript
jquery中实现简单的tabs插件功能的代码
Mar 02 Javascript
Jquery图片滚动与幻灯片的实例代码
Apr 08 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
Jan 24 Javascript
JavaScript框架是什么?怎样才能叫做框架?
Jul 01 Javascript
浅谈jQuery中setInterval()方法
Jul 07 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
Sep 20 Javascript
微信小程序进行微信支付的步骤昂述
Dec 01 Javascript
有趣的bootstrap走动进度条
Dec 01 Javascript
JavaScript中闭包的详解
Apr 01 Javascript
Vue.js实现的购物车功能详解
Jan 27 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
Apr 07 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学习之PHP变量
2006/10/09 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
php查找任何页面上的所有链接的方法
2013/12/03 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
Javascript 入门基础学习
2010/03/10 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
python获取远程图片大小和尺寸的方法
2015/03/26 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
飘柔洗发水广告词
2014/03/14 职场文书
老师对学生的寄语
2014/04/09 职场文书
赔偿协议书范本
2014/04/15 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
反腐倡廉标语
2014/06/24 职场文书
付款承诺函范文
2015/01/21 职场文书
地球上的星星观后感
2015/06/02 职场文书