JavaScript中的null和undefined解析


Posted in Javascript onApril 14, 2012

在JavaScript开发中,被人问到:null与undefined到底有啥区别?

一时间不好回答,特别是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
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 相关文章推荐
设置下载不需要倒计时cookie(倒计时代码)
Nov 19 Javascript
jQuery实现的文字hover颜色渐变效果实例
Feb 20 Javascript
JavaScript学习笔记之数组的增、删、改、查
Mar 23 Javascript
JavaScript实现解析INI文件内容的方法
Nov 17 Javascript
Bootstrap基本组件学习笔记之面板(14)
Dec 08 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
Feb 20 Javascript
微信小程序页面开发注意事项整理
May 18 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
Sep 20 jQuery
vue 自定义 select内置组件
Apr 10 Javascript
JavaScript面向对象程序设计创建对象的方法分析
Aug 13 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
May 07 Javascript
ant design vue datepicker日期选择器中文化操作
Oct 28 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
Apr 14 #Javascript
jquerymobile checkbox及时刷新才能获取其准确值
Apr 14 #Javascript
深入理解JavaScript系列(16) 闭包(Closures)
Apr 12 #Javascript
深入理解JavaScript系列(15) 函数(Functions)
Apr 12 #Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
Apr 12 #Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
Apr 12 #Javascript
window.parent与window.openner区别介绍
Apr 12 #Javascript
You might like
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
jquery select下拉框操作的一些说明
2010/04/02 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
医药专业推荐信
2013/11/15 职场文书
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
老干部工作汇报材料
2014/10/28 职场文书
2015年街道办事处工作总结
2015/05/22 职场文书
力克胡哲观后感
2015/06/10 职场文书
Redis keys命令的具体使用
2022/06/05 Redis