JS基础之undefined与null的区别分析


Posted in Javascript onAugust 08, 2011

于是,细想之后,写下本文,请各位大侠拍砖。
总所周知:
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 text,radio,checkbox,select操作实现代码
Jul 09 Javascript
JS面向对象编程浅析
Aug 28 Javascript
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
Feb 27 Javascript
javascript禁制后退键(Backspace)实例代码
Nov 15 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
Mar 08 Javascript
jQuery事件绑定on()与弹窗实现代码
Apr 28 Javascript
Vue.js组件使用开发实例教程
Nov 01 Javascript
Vue+Vux项目实践完整代码
Nov 30 Javascript
tween.js缓动补间动画算法示例
Feb 13 Javascript
vue 组件中slot插口的具体用法
Apr 03 Javascript
在react中使用vuex的示例代码
Jul 30 Javascript
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
jQuery的12招常用技巧分享
Aug 08 #Javascript
利用javascript的面向对象的特性实现限制试用期
Aug 04 #Javascript
jquery动态加载图片数据练习代码
Aug 04 #Javascript
jquery里的正则表达式说明
Aug 03 #Javascript
基于jQuery的图片剪切插件
Aug 03 #Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
Aug 03 #Javascript
JavaScript 一道字符串分解的题目
Aug 03 #Javascript
You might like
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
JavaScript入门教程(2) JS基础知识
2009/01/31 Javascript
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
Angular4实现动态添加删除表单输入框功能
2017/08/11 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
Python标准库defaultdict模块使用示例
2015/04/28 Python
详解Python中break语句的用法
2015/05/14 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
python数据处理实战(必看篇)
2017/06/11 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
python 文件转成16进制数组的实例
2018/07/09 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
西班牙自行车和跑步商店:Alltricks
2018/07/07 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
应届生法律求职信
2013/10/22 职场文书
酒店中秋节促销方案
2014/01/30 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python