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操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
Sep 26 Javascript
js 跨域和ajax 跨域问题小结
Jul 01 Javascript
javascript 自定义事件初探
Aug 21 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
Mar 28 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
Dec 19 Javascript
JavaScript实现的图像模糊算法代码分享
Apr 22 Javascript
一个简单的jquery的多选下拉框(自写)
May 05 Javascript
javascript实现信息增删改查的方法
Jul 25 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
May 03 Javascript
js编写简单的计时器功能
Jul 15 Javascript
微信小程序修改checkbox的样式代码实例
Jan 21 Javascript
JavaScript实现左右滚动电影画布
Feb 06 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
帖几个PHP的无限分类实现想法~
2007/01/02 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
详解Python发送email的三种方式
2018/10/18 Python
Python3.5装饰器原理及应用实例详解
2019/04/30 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
团队拓展活动方案
2014/08/28 职场文书
2014超市收银员工作总结
2014/11/13 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
领导参观欢迎词
2015/01/26 职场文书
IDEA中sout快捷键无效问题的解决方法
2022/07/23 Java/Android