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 获取浏览器所在的IP地址的小例子
Nov 08 Javascript
一个实用的图片切换支持点击切换和自动轮播
Sep 09 Javascript
Javascript快速排序算法详解
Dec 03 Javascript
JS+CSS实现Li列表隔行换色效果的方法
Feb 16 Javascript
jQuery插件实现大图全屏图片相册
Mar 14 Javascript
js实现人才网站职位选择功能的方法
Aug 14 Javascript
Javascript实现鼠标框选操作  不是点击选取
Apr 14 Javascript
jquery选择器中的空格与大于号>、加号+与波浪号~的区别介绍
Jun 24 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
Mar 22 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
Apr 11 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
May 01 Javascript
Vue实现返回顶部按钮实例代码
Oct 21 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
VOLVO车载收音机
2021/03/02 无线电
php 常用字符串函数总结
2008/03/15 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
Python中实现三目运算的方法
2015/06/21 Python
python编写简单爬虫资料汇总
2016/03/22 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
tensorflow识别自己手写数字
2018/03/14 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
python字符串判断密码强弱
2020/03/18 Python
Python通过Pillow实现图片对比
2020/04/29 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
Jogun Shop中文官网:韩国知名时尚男装网站
2016/10/12 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
房产买卖委托公证书
2014/04/04 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
个人融资协议书
2014/10/02 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
Python中time与datetime模块使用方法详解
2022/03/31 Python
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技