Javascript类型系统之undefined和null浅析


Posted in Javascript onJuly 13, 2016

前面的话

一般的程序语言,表示空的只有null,但javascript的设计者Brendan Eich却设计了一个undefined,这无疑增加了程序复杂度,但这样做也是有一定原因的。本文将详细介绍javascript中的undefined和null

历史原因

1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示”无”的值。根据C语言的传统,null被设计成可以自动转为0

但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。首先,null像在Java里一样,被当成一个对象。但是,JavaScript的值分成原始类型和对象类型两大类,Brendan Eich觉得表示”无”的值最好不是对象。其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误

因此,Brendan Eich又设计了一个undefined。他是这样区分的:null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN

但是,目前null和undefined基本是同义的,都是原始类型,且只有一些细微的差别

undefined

Undefined类型只有一个值,就是undefined。当声明的变量未初始化时,该变量的默认值是undefined。所以一般地,undefined表示变量没有初始化

var test;//undefined
console.log(test == undefined);//true
var test = undefined;//undefined

对于尚未声明过的变量只能执行一项操作,使用typeof操作符检测其数据类型,但严格模式下会导致错误

typeof(test);//undefined

【出现场景】

【1】已声明未赋值的变量

【2】获取对象不存在的属性

【3】无返回值的函数的执行结果

【4】函数的参数没有传入

【5】void(expression)

var i;
console.log(i);//undefined
var o = {};
console.log(o.p);//undefined
function f(){};
console.log(f());//undefined
function f(x){return x;}
console.log(f());//undefined
console.log(void(0));//undefined

【类型转换】

Boolean(undefined):  false
Number(undefined):  NaN
String(undefined):'undefined'

null

Null类型只有一个值,就是null。null是javascript语言的关键字,它表示一个特殊值,常用来描述"空值"

逻辑角度看,null值表示一个空对象指针

[注意]null是空对象指针,而[]是空数组,{}是空对象,三者不相同

console.log(typeof null);//'object'

尽管null和undefined是不同的,但它们都表示"值的空缺",null表示"空值",undefined表示"未定义"。两者往往可以互换。判断相等运算符==认为两者是相等的

console.log(null == undefined);//true

实际上,因为undefined和null不是构造器类型,所以它们没有任何的属性和方法,使用.和[]来存取这两个值的成员或方法都会产生一个类型错误

【类型转换】

Boolean(null): false
Number(null):
 0
String(null): 
 'null'

下面给大家介绍javascript中null和undefined的区别

undefined表示变量声明但未初始化时的值,null表示准备用来保存对象,还没有真正保存对象的值。从逻辑角度看,null值表示一个空对象指针。

JavaScript(ECMAScript标准)里共有5种基本类型:Undefined, Null, Boolean, Number, String,和一种复杂类型Object。可以看到null和undefined分属不同的类型,未初始化定义的值用typeof检测出来是"undefined"(字符串),而null值用typeof检测出来是"object"(字符串)。

任何时候都不建议显式的设置一个变量为undefined,但是如果保存对象的变量还没有真正保存对象,应该设置成null。
实际上,undefined值是派生自null值的,ECMAScript标准规定对二者进行相等性测试要返回true,即

alert(null==undefined); // true
Javascript 相关文章推荐
javascript倒计时功能实现代码
Jun 07 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
Jun 18 Javascript
js全屏显示显示代码的三种方法
Nov 11 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
分享一些常用的jQuery动画事件和动画函数
Nov 27 Javascript
Javascript基于AJAX回调函数传递参数实例分析
Dec 15 Javascript
js中利用tagname和id获取元素的方法
Jan 03 Javascript
教你如何终止JQUERY的$.AJAX请求
Feb 23 Javascript
深入浅析JavaScript中的作用域和上下文
Mar 26 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
May 17 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
Dec 06 Javascript
JS如何监听div的resize事件详解
Dec 03 Javascript
JS基础随笔(菜鸟必看篇)
Jul 13 #Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 #Javascript
jQuery实现div横向拖拽排序的简单实例
Jul 13 #Javascript
用jQuery向div中添加Html文本内容的简单实现
Jul 13 #Javascript
使用jQuery加载html页面到指定的div实现方法
Jul 13 #Javascript
用原生JS对AJAX做简单封装的实例代码
Jul 13 #Javascript
javascript类型系统——undefined和null全面了解
Jul 13 #Javascript
You might like
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
php 判断服务器操作系统的类型
2014/02/17 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
js中更短的 Array 类型转换
2011/10/30 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
2017/06/12 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
Python之文字转图片方法
2018/05/10 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
EJB实例的生命周期
2016/10/28 面试题
经济与贸易专业应届生求职信
2013/11/19 职场文书
迟到检讨书800字
2014/01/13 职场文书
出生医学证明样本
2014/01/17 职场文书
列车长先进事迹材料
2014/01/25 职场文书
总经理岗位职责描述
2014/02/08 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
2014年残联工作总结
2014/11/21 职场文书
老员工辞职信范文
2015/05/12 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
2015党建工作简报
2015/07/21 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
MyBatis 动态SQL全面详解
2021/10/05 MySQL