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 相关文章推荐
判断iframe是否加载完成的完美方法
Jan 07 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
Mar 15 Javascript
基于JQuery 滑动与动画的说明介绍
Apr 18 Javascript
jquery控制display属性为none或block
Mar 31 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
Jun 27 Javascript
JavaScript 开发工具webstrom使用指南
Dec 09 Javascript
Javascript 运动中Offset的bug解决方案
Dec 24 Javascript
js中split和replace的用法实例
Feb 28 Javascript
React组件生命周期详解
Jul 03 Javascript
ES6解构赋值实例详解
Oct 31 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
Nov 25 Javascript
vue中使用v-model完成组件间的通信
Aug 22 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/06/11 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
PHP高并发和大流量解决方案整理
2021/03/09 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
Python中使用动态变量名的方法
2014/05/06 Python
python抓取最新博客内容并生成Rss
2015/05/17 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
Python模拟百度登录实例详解
2016/01/20 Python
python Django框架实现自定义表单提交
2016/03/25 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
python requests 测试代理ip是否生效
2018/07/25 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
2020/05/27 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
维也纳通行证:Vienna PASS
2019/07/18 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
护士求职推荐信范文
2013/11/23 职场文书
考试作弊被抓检讨书
2014/01/10 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
美术教师岗位职责
2014/03/18 职场文书
关于安全的演讲稿
2014/05/09 职场文书