JavaScript null和undefined区别分析


Posted in Javascript onOctober 14, 2009

一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理。于是,细想之后,写下本文,请各位大侠拍砖。
总所周知:null == undefined
但是:null !== undefined
那么这两者到底有啥区别呢?
请听俺娓娓道来...
null
这是一个对象,但是为空。因为是对象,所以 typeof null 返回 'object' 。
null 是 JavaScript 保留关键字。
null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值:
表达式:123 + null

结果值:123
表达式:123 * null

结果值:0
undefined
undefined是全局对象(window)的一个特殊属性,其值是未定义的。但 typeof undefined 返回 'undefined' 。
虽然undefined是有特殊含义的,但它确实是一个属性,而且是全局对象(window)的属性。请看下面的代码:

alert('undefined' in window);//输出:true 
var anObj = {}; 
alert('undefined' in anObj); //输出:false

从中可以看出,undefined是window对象的一个属性,但却不是anObj对象的一个属性。
注意:尽管undefined是有特殊含义的属性,但却不是JavaScript的保留关键字。
undefined参与任何数值计算时,其结果一定是NaN。
随便说一下,NaN是全局对象(window)的另一个特殊属性,Infinity也是。这些特殊属性都不是JavaScript的保留关键字!
提高undefined性能
当我们在程序中使用undefined值时,实际上使用的是window对象的undefined属性。
同样,当我们定义一个变量但未赋予其初始值,例如:
var aValue;
这时,JavaScript在所谓的预编译时会将其初始值设置为对window.undefined属性的引用,
于是,当我们将一个变量或值与undefined比较时,实际上是与window对象的undefined属性比较。这个比较过程中,JavaScript会搜索window对象名叫‘undefined'的属性,然后再比较两个操作数的引用指针是否相同。
由于window对象的属性值是非常多的,在每一次与undefined的比较中,搜索window对象的undefined属性都会花费时 间。在需要频繁与undefined进行比较的函数中,这可能会是一个性能问题点。因此,在这种情况下,我们可以自行定义一个局部的undefined变 量,来加快对undefined的比较速度。例如:
function anyFunc() { 
var undefined; 
//自定义局部undefined变量 
if(x == undefined) 
//作用域上的引用比较 
while(y != undefined) 
//作用域上的引用比较 
};

其中,定义undefined局部变量时,其初始值会是对window.undefined属性值的引用。新定义的局部undefined变 量存在与该函数的作用域上。在随后的比较操作中,JavaScript代码的书写方式没有任何的改变,但比较速度却很快。因为作用域上的变量数量会远远少 于window对象的属性,搜索变量的速度会极大提高。
这就是许多前端JS框架为什么常常要自己定义一个局部undefined变量的原因!
Javascript 相关文章推荐
在JavaScript中监听IME键盘输入事件
May 29 Javascript
纯css实现窗户玻璃雨滴逼真效果
Aug 23 Javascript
javascript实现禁止复制网页内容汇总
Dec 30 Javascript
jquery实现简单的全选和反选功能
Jan 02 Javascript
深入理解JS中的substr和substring
Apr 26 Javascript
JS 实现计算器详解及实例代码(一)
Jan 08 Javascript
BootStrap 页签切换失效的解决方法
Aug 17 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
May 08 Javascript
vue移动端实现红包雨效果
Jun 23 Javascript
AngularJS上传文件的示例代码
Nov 10 Javascript
微信小程序 如何保持登录状态
Aug 16 Javascript
JavaScript实现答题评分功能页面
Jun 24 Javascript
JavaScript iframe的相互操作浅析
Oct 14 #Javascript
使用jQuery简化Ajax开发 Ajax开发入门
Oct 14 #Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
Oct 14 #Javascript
JS+XML 省份和城市之间的联动实现代码
Oct 14 #Javascript
jquery 常用操作整理 基础入门篇
Oct 14 #Javascript
一些技巧性实用js代码小结
Oct 14 #Javascript
Jquery 学习笔记(一)
Oct 13 #Javascript
You might like
PHP daddslashes 使用方法介绍
2012/10/26 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
php实现的简单检验登陆类
2015/06/18 PHP
js鼠标左右键 键盘值小结
2010/06/11 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
jquery移动节点实例
2015/01/14 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
vue2 设置router-view默认路径的实例
2018/09/20 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
[17:36]VG战队纪录片
2014/08/21 DOTA
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
python计算无向图节点度的实例代码
2019/11/22 Python
python 5个顶级异步框架推荐
2020/09/09 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
工程部经理岗位职责
2013/12/08 职场文书
酒店出纳岗位职责
2013/12/29 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
干部外出学习心得体会
2016/01/18 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
Python基础 括号()[]{}的详解
2021/11/07 Python
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python
vue elementUI表格控制对应列
2022/04/13 Vue.js