JavaScript中的null和undefined解析


Posted in Javascript onApril 14, 2012

在JavaScript开发中,被人问到:null与undefined到底有啥区别?

一时间不好回答,特别是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
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 相关文章推荐
js中几种去掉字串左右空格的方法
Dec 25 Javascript
node.js中的fs.rmdir方法使用说明
Dec 16 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
Jan 05 Javascript
深入理解jQuery中的事件冒泡
May 24 Javascript
Backbone View 之间通信的三种方式
Aug 09 Javascript
快速解决js中window.location.href不工作的问题
Nov 02 Javascript
jQuery实现表单动态添加数据并提交的方法
Jul 19 jQuery
Vue将页面导出为图片或者PDF
Aug 17 Javascript
使用vue制作滑动标签
Sep 21 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
May 13 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
Jul 28 Javascript
基于vue的video播放器的实现示例
Feb 19 Vue.js
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
Apr 14 #Javascript
jquerymobile checkbox及时刷新才能获取其准确值
Apr 14 #Javascript
深入理解JavaScript系列(16) 闭包(Closures)
Apr 12 #Javascript
深入理解JavaScript系列(15) 函数(Functions)
Apr 12 #Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
Apr 12 #Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
Apr 12 #Javascript
window.parent与window.openner区别介绍
Apr 12 #Javascript
You might like
PHP4实际应用经验篇(7)
2006/10/09 PHP
php email邮箱正则
2008/10/08 PHP
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
php和javascript之间变量的传递实现代码
2012/12/19 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
thinkphp分页集成实例
2017/07/24 PHP
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
jQuery学习总结之jQuery事件
2014/06/30 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
Python translator使用实例
2008/09/06 Python
详解Python中heapq模块的用法
2016/06/28 Python
Python解惑之True和False详解
2017/04/24 Python
浅谈numpy生成数组的零值问题
2018/11/12 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
python中使用while循环的实例
2019/08/05 Python
python绘制封闭多边形教程
2020/02/18 Python
Python模块相关知识点小结
2020/03/09 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
京东国际站:JOYBUY
2017/11/23 全球购物
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
餐饮主管岗位职责
2013/12/10 职场文书
财务会计实习报告体会
2013/12/20 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
浅谈python数据类型及其操作
2021/05/25 Python