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拖拽的效果类和dom-drag.js浅析
Jul 17 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
Apr 09 Javascript
可以用鼠标拖动的DIV实现思路及代码
Oct 21 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
Oct 29 Javascript
jquery SweetAlert插件实现响应式提示框
Aug 18 Javascript
分享一个插件实现水珠自动下落效果
Jun 01 Javascript
详解Javascript中prototype属性(推荐)
Sep 03 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
Apr 23 Javascript
vue-cli单页应用改成多页应用配置详解
Jul 14 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
Apr 01 Javascript
详解微信小程序自定义组件的实现及数据交互
Jul 22 Javascript
Vue项目打包部署到apache服务器的方法步骤
Feb 01 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
PHP加速 eAccelerator配置和使用指南
2009/06/05 PHP
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
php网站地图生成类示例
2014/01/13 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
php实现记事本案例
2020/10/20 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
Django实现发送邮件功能
2019/07/18 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
vue路由实现登录拦截
2021/03/24 Vue.js
大学军训感言1500字
2014/03/09 职场文书
2015年班组工作总结
2015/04/20 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书