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 相关文章推荐
Jquery Ajax.ashx 高效分页实现代码
Oct 20 Javascript
JavaScript中双叹号(!!)作用示例介绍
Apr 10 Javascript
Node调试工具JSHint的安装及配置教程
May 27 Javascript
javascript异步处理工作机制详解
Apr 13 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
Nov 25 Javascript
jquery表单提交带错误信息提示效果
Mar 09 Javascript
Javascript实现倒计时时差效果
May 18 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
Aug 18 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
Oct 20 Javascript
javascript高级模块化require.js的具体使用方法
Oct 31 Javascript
Vue中v-for的数据分组实例
Mar 07 Javascript
解决JavaScript layui 下拉框不显示的问题
Aug 14 Javascript
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
PHP 日期加减的类,很不错
2009/10/10 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
javascript 动态创建表格
2015/01/08 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
jQuery设计思想
2017/03/07 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
JS document文档的简单操作完整示例
2020/01/13 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
使用Python机器学习降低静态日志噪声
2018/09/29 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
Python循环结构的应用场景详解
2019/07/11 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
HTML5拖放功能_动力节点Java学院整理
2017/07/13 HTML / CSS
html5录音功能实战示例
2019/03/25 HTML / CSS
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
大学生党课思想汇报
2013/12/29 职场文书
诚实守信演讲稿
2014/09/01 职场文书
学校体育节班级口号
2015/12/25 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python