理解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 相关文章推荐
js原生appendChild的bug解决心得分享
Jul 01 Javascript
Node.js开发指南中的简单实例(mysql版)
Sep 17 Javascript
javascript函数特点实例分析
May 14 Javascript
js显示当前日期时间和星期几
Oct 22 Javascript
超赞的jQuery图片滑块动画特效代码汇总
Jan 25 Javascript
解决vue router使用 history 模式刷新后404问题
Jul 19 Javascript
微信小程序switch组件使用详解
Jan 31 Javascript
AJAX在JQuery中的应用详解
Jan 30 jQuery
使用ESLint禁止项目导入特定模块的方法步骤
Mar 04 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
Oct 30 Javascript
使用JavaScript计算前一天和后一天的思路详解
Dec 20 Javascript
微信小程序如何加载数据库真实数据的实现
Mar 04 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
PHP生成sitemap.xml地图函数
2013/11/13 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
js判断变量是否空值的代码
2008/10/26 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
js中开关变量使用实例
2017/02/24 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
实例讲解React 组件
2020/07/07 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
pyshp创建shp点文件的方法
2018/12/31 Python
Python调用服务接口的实例
2019/01/03 Python
详解Python学习之安装pandas
2019/04/16 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
什么是属性访问器
2015/10/26 面试题
MYSQL基础面试题
2012/05/13 面试题
高三学生评语大全
2014/04/25 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
2014年团支部工作总结
2014/11/17 职场文书
项目战略合作意向书
2015/05/08 职场文书
校园歌手大赛主持词
2015/07/03 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技