JavaScript null和undefined区别分析


Posted in Javascript onOctober 14, 2009

一时间不好回答,特别是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 
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来定位
Feb 20 Javascript
javascript json 新手入门文档
Dec 03 Javascript
基于jQuery的树控件实现代码(asp.net+json)
Jul 11 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
Jan 16 Javascript
js中arguments的用法(实例讲解)
Nov 30 Javascript
jquery 无限级下拉菜单的简单实现代码
Feb 21 Javascript
jquery easyui使用心得
Jul 07 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
Jul 01 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
Mar 10 Javascript
javascript数组定义的几种方法
Oct 06 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
Jun 24 Javascript
JavaScript iframe的相互操作浅析
Oct 14 #Javascript
使用jQuery简化Ajax开发 Ajax开发入门
Oct 14 #Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
Oct 14 #Javascript
JS+XML 省份和城市之间的联动实现代码
Oct 14 #Javascript
jquery 常用操作整理 基础入门篇
Oct 14 #Javascript
一些技巧性实用js代码小结
Oct 14 #Javascript
Jquery 学习笔记(一)
Oct 13 #Javascript
You might like
PHP实现分页的一个示例
2006/10/09 PHP
PHP三元运算符的结合性介绍
2012/01/10 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
datagrid框架的删除添加与修改
2013/04/08 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
python dataframe NaN处理方式
2019/12/26 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
美国牛仔品牌:True Religion
2018/11/16 全球购物
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
优秀社区干部事迹材料
2014/02/03 职场文书
代理班主任的自我评价
2014/02/04 职场文书
公司搬迁通知
2015/04/20 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
python如何查找列表中元素的位置
2022/05/30 Python
win sever 2022如何占用操作主机角色
2022/06/25 Servers
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL