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 相关文章推荐
关于__defineGetter__ 和__defineSetter__的说明
May 12 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 Javascript
javascript和jquery修改a标签的href属性
Dec 16 Javascript
浅谈JS日期(Date)处理函数
Dec 07 Javascript
JQuery中Text方法用法实例分析
May 18 Javascript
微信小程序 教程之wxapp 视图容器 view
Oct 19 Javascript
js简单正则验证汉字英文及下划线的方法
Nov 28 Javascript
vue源码入口文件分析(推荐)
Jan 30 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
May 16 jQuery
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
May 16 Javascript
vue+Element-ui实现分页效果实例代码详解
Dec 10 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
Apr 30 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 生成随机验证码图片代码
2010/02/08 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
微信小程序云开发之使用云数据库
2019/05/17 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
python生成验证码图片代码分享
2016/01/28 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
国际政治个人自荐信范文
2013/11/26 职场文书
《藏戏》教学反思
2014/02/11 职场文书
一岗双责责任书
2014/04/15 职场文书
会计学专业求职信
2014/07/17 职场文书
农村文化活动总结
2014/08/28 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
学校中秋节活动总结
2015/03/23 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
Python爬虫基础初探selenium
2021/05/31 Python
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android