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 相关文章推荐
node在两个div之间移动,用ztree实现
Mar 06 Javascript
js图片延迟加载的实现方法及思路
Jul 22 Javascript
javascript中Array()数组函数详解
Aug 23 Javascript
基于Vuejs框架实现翻页组件
Jun 29 Javascript
jquery easyui validatebox remote的使用详解
Nov 09 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
Jan 16 Javascript
jQuery弹出层插件popShow(改进版)用法示例
Jan 23 Javascript
vue.js单页面应用实例的简单实现
Apr 10 Javascript
Vue SSR 组件加载问题
May 02 Javascript
详解为生产环境编译Angular2应用的方法
Dec 10 Javascript
Vue 开发必须知道的36个技巧(小结)
Oct 09 Javascript
在vue项目中封装echarts的步骤
Dec 25 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获取文件名后缀常用方法小结
2015/02/24 PHP
Laravel 5框架学习之环境与配置
2015/04/08 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
Augularjs-起步详解
2016/07/08 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
Python获取网页上图片下载地址的方法
2015/03/11 Python
Python处理字符串之isspace()方法的使用
2015/05/19 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
大二学期个人自我评价
2014/01/13 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
户籍证明模板
2014/09/28 职场文书
z-index不起作用
2021/03/31 HTML / CSS
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js