详解JavaScript中undefined与null的区别


Posted in Javascript onMarch 29, 2014

有点奇怪的是,JavaScript语言居然有两个表示"无"的值:undefined和null。这是为什么?

一、相似性
在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别。

var a = undefined;
var a = null;

上面代码中,a变量分别被赋值为undefined和null,这两种写法几乎等价。
undefined和null在if语句中,都会被自动转为false,相等运算符甚至直接报告两者相等。

if (!undefined) 
    console.log('undefined is false');
// undefined is false
if (!null) 
    console.log('null is false');
// null is false
undefined == null
// true

上面代码说明,两者的行为是何等相似!
既然undefined和null的含义与用法都差不多,为什么要同时设置两个这样的值,这不是无端增加JavaScript的复杂度,令初学者困扰吗?Google公司开发的JavaScript语言的替代品Dart语言,就明确规定只有null,没有undefined!
二、历史原因
最近,我在读新书《Speaking JavaScript》时,意外发现了这个问题的答案!
原来,这与JavaScript的历史有关。1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示"无"的值。
根据C语言的传统,null被设计成可以自动转为0。

Number(null)
// 0
5 + null
// 5

但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。
首先,null像在Java里一样,被当成一个对象。

typeof null
// "object"

但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示"无"的值最好不是对象。
其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。
因此,Brendan Eich又设计了一个undefined。
三、最初设计
JavaScript的最初版本是这样区分的:null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。

Number(undefined)
// NaN
5 + undefined
// NaN

四、目前的用法
但是,上面这样的区分,在实践中很快就被证明不可行。目前,null和undefined基本是同义的,只有一些细微的差别。
null表示"没有对象",即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。

Object.getPrototypeOf(Object.prototype)
// null

undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。

var i;
i // undefined
function f(x){console.log(x)}
f() // undefined
var  o = new Object();
o.p // undefined
var x = f();
x // undefined

Javascript 相关文章推荐
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
Nov 14 Javascript
下拉菜单点击实现连接跳转功能的js代码
May 19 Javascript
屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法
Dec 31 Javascript
js模仿php中strtotime()与date()函数实现方法
Aug 11 Javascript
深入浅析JavaScript中prototype和proto的关系
Nov 15 Javascript
js阻止浏览器默认行为的简单实例
May 15 Javascript
jQuery实现标签页效果实战(4)
Feb 08 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
Mar 21 Javascript
Vue一个案例引发的递归组件的使用详解
Nov 15 Javascript
vue+elementUI组件table实现前端分页功能
Nov 15 Javascript
javascript事件循环event loop的简单模型解释与应用分析
Mar 14 Javascript
Vue 3.0 全家桶抢先体验
Apr 28 Javascript
JQuery解析HTML、JSON和XML实例详解
Mar 29 #Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
Mar 28 #Javascript
javascript修改IMG标签的src问题
Mar 28 #Javascript
JS将光标聚焦在文本最后的实现代码
Mar 28 #Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
Mar 28 #Javascript
JavaScript调用ajax获取文本文件内容实现代码
Mar 28 #Javascript
js如何调用qq互联api实现第三方登录
Mar 28 #Javascript
You might like
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
Symfony2 session用法实例分析
2016/02/04 PHP
PDO::prepare讲解
2019/01/29 PHP
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
Bootstrap轮播插件简单使用方法介绍
2016/06/21 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
基于vue.js实现的分页
2018/03/13 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
说一说Python logging
2016/04/15 Python
Python自定义线程类简单示例
2018/03/23 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
python 求定积分和不定积分示例
2019/11/20 Python
keras topN显示,自编写代码案例
2020/07/03 Python
解决pip install psycopg2出错问题
2020/07/09 Python
详解CSS3中强大的filter(滤镜)属性
2017/06/29 HTML / CSS
Java的接口和C++的虚类的相同和不同处
2014/03/27 面试题
药剂学专业应届生自荐信
2013/09/29 职场文书
医院辞职信范文
2014/01/17 职场文书
元旦获奖感言
2014/03/08 职场文书
毕业生如何写自我鉴定
2014/03/15 职场文书
十佳护士先进事迹
2014/05/08 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
活动主持人开场白
2015/05/28 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers