理解Javascript_02_理解undefined和null


Posted in Javascript onOctober 11, 2010

来自普遍的回答:
其实在 ECMAScript 的原始类型中,是有Undefined 和 Null 类型的。 这两种类型都分别对应了属于自己的唯一专用值,即undefined 和 null。
值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的,通过下列代码可以验证这一结论:
alert(undefined == null); //true

尽管这两个值相等,但它们的含义不同。
undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。
所以alert(undefined===null);//false

说实话,我没有看明白,为什么undefined会继承null,即然是继承那为什么undefined!==null,还有未初始化的变量与函数返回的对象不存在之间有什么区别,问题种种,让人很不信服。

看看内存是怎么说的:
Udefined代表没有赋值的基本数据类型。
Null代表没有赋值的引用数据类型。
我们来看一段代码:

var age; 
var id = 100; 
var div02 = document.getElementById("div02");//注:div02是不存在的 
var div01 = document.getElementById("div01");//注:div01存在 
alert(id);//100 
alert(age);//undefined 
alert(div02);//null 
alert(div01);//object

再来看一下内存的情况:
理解Javascript_02_理解undefined和null
解决第一个问题:为什么undefine继承自null

在Javascript中,基本数据类型都有一个与其对应的引用数据类型,number Number,string String,boolean Boolean...,他们具有完全相同的行为,并且相互之间会产生自动拆箱与装箱的操作。在内存分析一文中已经讲述了基本数据类型放在栈内存中的意义,由此这们可以得出一个肤浅的结论:基本数据类型是对应引用数据类型的子类,只不过是为了提高效率,将其放在栈内存中而已,对应的Undefined代表无值的基本类型,Null代表无值的引用类型,那势必就可以推出undefined继承null。

解决第二个问题:为什么undefined==null

推出来的答案undefined继承自null,内存告诉我们的答案他们都处于栈中

解决第三个问题:为什么undefined!==null

内存告诉我们,它们的意义确实是不一样的,老话一句:Udefined代表没有赋值的基本数据类型,Null代表没有赋值的引用数据类型。他们的内存图有很大的区别

解决额外的问题:null是处理引用的,为什么null处在栈内存中,而不是堆内存中

答案一样的简单,效率!有必要在栈中分配一块额外的内存去指向堆中的null吗!

额外的收获:

当我们要切断与对象的联系,但又并不想给变量赋于其他的值,那么我们可了置null,如var obj = new Object();obj=null;

一些关于undefined和null的行为

null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值:

表达式:123 + null

结果值:123

typeof null 返回object,因为null代表是无值的引用。

undefined是全局对象(window)的一个特殊属性,其值为Undefined类型的专用值undefined

undefined参与任何数值计算时,其结果一定是NaN。

当声明的变量未初始化时,该变量的默认值是undefined,但是undefined并不同于未定义的值。Typeof运算符无法区分这两种值

因此对于变量是否存在的判断操作是通过if(typeof var == ‘undefined'){ //code here } 来进行判断的,这样既完全兼容未定义(undefined)和未初始化(uninitialized)两种情况的

哈哈,当你站在内存的高度的分析问题的时候,如此抽象的东西有了实际的表现,一切变得简单起来!

Javascript 相关文章推荐
jQuery 使用手册(四)
Sep 23 Javascript
关于document.cookie的使用javascript
Oct 29 Javascript
javascript中简单的进制转换代码实例
Oct 26 Javascript
在HTML代码中使用JavaScript代码的例子
Oct 16 Javascript
iframe里使用JavaScript控制主页转向的方法
Apr 03 Javascript
在JavaScript中如何解决用execCommand(
Oct 19 Javascript
jQuery Mobile操作HTML5的常用函数总结
May 17 Javascript
javascript类型系统_正则表达式RegExp类型详解
Jun 24 Javascript
JS获取和修改元素样式的实例代码
Aug 06 Javascript
详解JS对象封装的常用方式
Dec 30 Javascript
vue里input根据value改变背景色的实例
Sep 29 Javascript
tweenjs缓动算法的使用实例分析
Aug 26 Javascript
理解Javascript_01_理解内存分配原理分析
Oct 11 #Javascript
javascript getElementsByClassName实现代码
Oct 11 #Javascript
javascript Array.prototype.slice使用说明
Oct 11 #Javascript
javascript 伪数组实现方法
Oct 11 #Javascript
javascript forEach通用循环遍历方法
Oct 11 #Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 #Javascript
JavaScript isArray()函数判断对象类型的种种方法
Oct 11 #Javascript
You might like
ajax缓存问题解决途径
2006/12/06 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
apache部署python程序出现503错误的解决方法
2017/07/24 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
解决python 无法加载downsample模型的问题
2018/10/25 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
附答案的Java面试题
2012/11/19 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
找工作求职信
2014/07/07 职场文书
Redis集群的关闭与重启操作
2021/07/07 Redis