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 通过模式匹配实现重载
Aug 12 Javascript
extjs之去除s.gif的影响
Dec 25 Javascript
node.js正则表达式获取网页中所有链接的代码实例
Jun 03 Javascript
jQuery中wrapInner()方法用法实例
Jan 16 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
Jun 05 Javascript
深入浅析react native es6语法
Dec 09 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
Sep 20 Javascript
jquery实现倒计时小应用
Sep 19 jQuery
Javascript 实现 Excel 导入生成图表功能
Oct 22 Javascript
es6基础学习之解构赋值
Dec 10 Javascript
js实现转动骰子模型
Oct 24 Javascript
在vue中通过render函数给子组件设置ref操作
Nov 17 Vue.js
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 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
3种php生成唯一id的方法
2015/11/23 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
python练习程序批量修改文件名
2014/01/16 Python
Python跳出循环语句continue与break的区别
2014/08/25 Python
Python编码类型转换方法详解
2016/07/01 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
python如何运行js语句
2020/09/09 Python
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
出国留学自荐信
2013/10/25 职场文书
工程部主管岗位职责
2013/11/17 职场文书
求职信的要素有哪些呢
2013/12/26 职场文书
物业管理毕业生的自我评价
2014/02/17 职场文书
幼儿园小班家长寄语
2014/04/02 职场文书
司机工作自我鉴定
2014/09/19 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
初中化学教学反思
2016/02/22 职场文书