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 相关文章推荐
popdiv
Jul 14 Javascript
JavaScript验证图片类型(扩展名)的函数分享
May 05 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
Aug 11 Javascript
express的中间件bodyParser详解
Dec 04 Javascript
JS模拟Dialog弹出浮动框效果代码
Oct 16 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
Nov 30 Javascript
jQuery设置Cookie及删除Cookie实例分析
Apr 15 Javascript
JS中使用DOM来控制HTML元素
Jul 31 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
Nov 30 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 Javascript
Vue中的v-for循环key属性注意事项小结
Aug 12 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 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 新手入门教程
2009/08/03 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
PHP制作用户注册系统
2015/10/23 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
js函数在frame中的相互调用详解
2014/03/03 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
实例详解Node.js 函数
2018/06/10 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
Python实现平行坐标图的两种方法小结
2019/07/04 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
用python读取xlsx文件
2020/12/17 Python
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
银行财务部实习生的自我鉴定
2013/11/27 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书