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 相关文章推荐
javascript闭包的高级使用方法实例
Jul 04 Javascript
jquery自动填充勾选框即把勾选框打上true
Mar 24 Javascript
非常酷炫的Bootstrap图片轮播动画
May 27 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
Jul 14 Javascript
jquery.Callbacks的实现详解
Nov 30 Javascript
js实现的在线调色板功能完整实例
Dec 21 Javascript
bootstrap select插件封装成Vue2.0组件
Apr 17 Javascript
js+html制作简单日历的方法
Jun 27 Javascript
Vue.js项目部署到服务器的详细步骤
Jul 17 Javascript
使用Vue实现图片上传的三种方式
Jul 17 Javascript
Element-ui DatePicker显示周数的方法示例
Jul 19 Javascript
单线程JavaScript实现异步过程详解
May 19 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面向对象中的魔术方法中文说明
2014/03/04 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
csdn 批量接受好友邀请
2009/02/19 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
js实现鼠标悬浮给图片加边框的方法
2015/01/30 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
js canvas仿支付宝芝麻信用分仪表盘
2016/11/16 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
Python对列表排序的方法实例分析
2015/05/16 Python
Python正则表达式经典入门教程
2017/05/22 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
什么是Remote Module
2016/06/10 面试题
文明教师事迹材料
2014/01/16 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
行政人事专员岗位职责
2014/03/05 职场文书
信用卡工作证明模板
2014/09/14 职场文书
党员自评材料范文
2014/12/17 职场文书
解析Java中的static关键字
2021/06/14 Java/Android
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB