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 获取指定标签的对象及属性的设置与移除
May 29 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
Jul 23 Javascript
推荐一个封装好的getElementsByClassName方法
Dec 02 Javascript
jquery+ajax实现跨域请求的方法
Jan 20 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
Aug 20 Javascript
JS实现简单短信验证码界面
Aug 07 Javascript
vue 实现的树形菜的实例代码
Mar 19 Javascript
Vue使用json-server进行后端数据模拟功能
Apr 17 Javascript
Angular5中状态管理的实现
Sep 03 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
Feb 21 Javascript
最简单的vue消息提示全局组件的方法
Jun 16 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中的超全局变量
2006/10/09 PHP
PHP 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
判断数组的最佳方法(推荐)
2016/10/11 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
jquery实现进度条状态展示
2020/03/26 jQuery
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
python看某个模块的版本方法
2018/10/16 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
员工拾金不昧表扬信
2014/01/09 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
上级检查欢迎词
2014/01/18 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
财务工作失误检讨书
2015/02/19 职场文书
军事博物馆观后感
2015/06/05 职场文书
小学毕业感言100字
2015/07/30 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers