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 相关文章推荐
浅析LigerUi开发中谨慎载入common.css文件
Jul 09 Javascript
jquery 提示信息显示后自动消失的具体实现
Dec 18 Javascript
实例说明为什么不要行内使用javascript
Apr 18 Javascript
使用JavaScript和C#中获得referer
Nov 14 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
Jan 02 Javascript
javascript基本包装类型介绍
Apr 10 Javascript
jQuery插件boxScroll实现图片轮播特效
Jul 14 Javascript
jQuery入门基础知识学习指南
Aug 14 Javascript
JavaScript获取ul中li个数的方法
Feb 13 Javascript
VUE使用vuex解决模块间传值问题的方法
Jun 01 Javascript
vue组件学习教程
Sep 09 Javascript
Windows安装Node.js报错:2503、2502的解决方法
Oct 25 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
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
php中strtotime函数用法详解
2014/11/15 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
jquery $.each() 使用小探
2013/08/23 Javascript
Extjs表单常见验证小结
2014/03/07 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
浅析TypeScript 命名空间
2020/03/19 Javascript
js实现点击烟花特效
2020/10/14 Javascript
使用Python求解最大公约数的实现方法
2015/08/20 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
HTML5 weui使用笔记
2019/11/21 HTML / CSS
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
shell程序中如何注释
2012/02/17 面试题
工会工作个人总结
2015/03/03 职场文书
vue中 this.$set的使用详解
2021/11/17 Vue.js
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL
MySQL插入数据与查询数据
2022/03/25 MySQL
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技