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 相关文章推荐
js 有框架页面跳转(target)三种情况下的应用
Apr 09 Javascript
Javascript代码在页面加载时的执行顺序介绍
May 03 Javascript
IE下写xml文件的两种方式(fso/saveAs)
Aug 05 Javascript
js 中将多个逗号替换为一个逗号的代码
Jun 07 Javascript
javascript实现dom元素可拖动
Mar 21 Javascript
js控制li的隐藏和显示实例代码
Oct 15 Javascript
js阻止冒泡和默认事件(默认行为)详解
Oct 20 Javascript
js实现HashTable(哈希表)的实例分析
Nov 21 Javascript
脚本div实现拖放功能(两种)
Feb 13 Javascript
js+html5生成自动排列对话框实例
Oct 09 Javascript
JS中数组与对象的遍历方法实例小结
Aug 14 Javascript
Vue axios 跨域请求无法带上cookie的解决
Sep 08 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
mysql limit查询优化分析
2008/11/12 PHP
PHP四大安全策略
2014/03/12 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
js单例模式的两种方案
2013/10/22 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
JS实现字符串转日期并比较大小实例分析
2015/12/09 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
nodejs 实现钉钉ISV接入的加密解密方法
2017/01/16 NodeJs
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
微信小程序实现天气预报功能
2018/07/18 Javascript
JS基于Location实现访问Url、重定向及刷新页面的方法分析
2018/12/03 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
2019/11/21 Javascript
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
对python字典过滤条件的实例详解
2019/01/22 Python
Python argparse模块应用实例解析
2019/11/15 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
一些高难度的SQL面试题
2016/11/29 面试题
Windows和Linux动态库应用异同
2016/04/17 面试题
表彰会主持词
2014/03/26 职场文书
学习党章的体会
2014/11/07 职场文书
2014年减负工作总结
2014/12/10 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
一级电子管军用接收机测评
2022/04/05 无线电