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 相关文章推荐
javascript之水平横向滚动歌词同步的应用
May 07 Javascript
JavaScript中的property和attribute介绍
Dec 26 Javascript
JavaScript中setAttribute用法介绍
Jul 20 Javascript
jQuery判断元素是否存在的可靠方法
May 06 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
Dec 16 Javascript
详解handlebars+require基本使用方法
Dec 21 Javascript
JavaScript字符集编码与解码详谈
Feb 02 Javascript
JQuery validate 验证一个单独的表单元素实例
Feb 17 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
Apr 26 Javascript
微信小程序 image组件遇到的问题
May 28 Javascript
js实现图片上传即时显示效果
Sep 30 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
Jul 20 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版(5)
2006/10/09 PHP
php文件怎么打开 如何执行php文件
2011/12/21 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
Python之指数与E记法的区别详解
2019/11/21 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
财务分析个人的自荐书范文
2013/11/24 职场文书
后进生转化工作制度
2014/01/17 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
工资证明格式模板
2015/06/12 职场文书