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 multiSelect 多选下拉框
Jul 09 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
Aug 05 Javascript
js的一些常用方法小结
Jun 29 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
js禁止document element对象选中文本实现代码
Mar 21 Javascript
js如何获取file控件的完整路径具体实现代码
May 15 Javascript
JS获取当前脚本文件的绝对路径
Mar 02 Javascript
JS DOM实现鼠标滑动图片效果
Sep 17 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
Jul 06 Javascript
JavaScript实现多重继承的方法分析
Jan 09 Javascript
快速解决vue-cli在ie9+中无效的问题
Sep 04 Javascript
微信小程序中悬浮窗功能的实现代码
Aug 02 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操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
php 动态添加记录
2009/03/10 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
JQuery实现自定义对话框的代码
2008/06/15 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
javascript利用apply和arguments复用方法
2013/11/25 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
有关json_decode乱码及NULL的问题
2015/10/13 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
JS实现的简单图片切换功能示例【测试可用】
2017/02/14 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
vue源码解析之事件机制原理
2018/04/21 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
JavaScript实现消消乐的源代码
2021/01/12 Javascript
python实现数组插入新元素的方法
2015/05/22 Python
python3 爬取图片的实例代码
2018/11/06 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
python关于调用函数外的变量实例
2019/12/26 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
电脑销售顾问自荐信
2014/01/29 职场文书
道德模范先进事迹
2014/02/14 职场文书
出生证明公证书
2014/04/09 职场文书
贺卡寄语大全
2014/04/11 职场文书
卖房协议书样本
2014/10/30 职场文书
python中filter,map,reduce的作用
2022/06/10 Python