JS基础之undefined与null的区别分析


Posted in Javascript onAugust 08, 2011

于是,细想之后,写下本文,请各位大侠拍砖。
总所周知:
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中的location用法简单介绍
Mar 07 Javascript
JavaScript Date对象使用总结
May 14 Javascript
JQuery toggle使用分析
Nov 16 Javascript
js自动查找select下拉的菜单并选择(示例代码)
Feb 26 Javascript
JavaSacript中charCodeAt()方法的使用详解
Jun 05 Javascript
jQuery实现自动调整字体大小的方法
Jun 15 Javascript
javascript适合移动端的日期时间拾取器
Nov 10 Javascript
详谈js原型继承的一些问题
Sep 06 Javascript
JavaScript寄生组合式继承实例详解
Jan 06 Javascript
JS实现的3des+base64加密解密算法完整示例
May 18 Javascript
JS 图片压缩原理与实现方法详解
Apr 29 Javascript
Vue如何基于vue-i18n实现多国语言兼容
Jul 17 Javascript
jQuery的12招常用技巧分享
Aug 08 #Javascript
利用javascript的面向对象的特性实现限制试用期
Aug 04 #Javascript
jquery动态加载图片数据练习代码
Aug 04 #Javascript
jquery里的正则表达式说明
Aug 03 #Javascript
基于jQuery的图片剪切插件
Aug 03 #Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
Aug 03 #Javascript
JavaScript 一道字符串分解的题目
Aug 03 #Javascript
You might like
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
jQuery中mouseover事件用法实例
2014/12/26 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
axios学习教程全攻略
2017/03/26 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
Vue中util的工具函数实例详解
2019/07/08 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
python进阶_浅谈面向对象进阶
2017/08/17 Python
python使用mysql的两种使用方式
2018/03/07 Python
python 把列表转化为字符串的方法
2018/10/23 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
python 基于opencv实现图像增强
2020/12/23 Python
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
低碳生活倡议书
2014/04/14 职场文书
期末学生评语大全
2014/04/24 职场文书
高中生操行评语
2014/04/25 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
python之np.argmax()及对axis=0或者1的理解
2021/06/02 Python
Oracle表空间与权限的深入讲解
2021/11/17 Oracle