理解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 相关文章推荐
另类调用flash无须激活的方法
Dec 27 Javascript
摘自百度的图片轮换效果代码
Nov 19 Javascript
js和jquery中循环的退出和继续学习记录
Sep 06 Javascript
jQuery复制节点用法示例(clone方法)
Sep 08 Javascript
如何提高Dom访问速度
Jan 05 Javascript
JavaScript数据结构之数组的表示方法示例
Apr 12 Javascript
jQuery Validate表单验证插件实现代码
Jun 08 jQuery
浅谈angular4生命周期钩子
Sep 05 Javascript
原生JavaScrpit中异步请求Ajax实现方法
Nov 03 Javascript
vue实现随机验证码功能的实例代码
Apr 30 Javascript
Vuex新手的理解与使用详解
May 31 Javascript
layui实现数据表格table分页功能(ajax异步)
Jul 27 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常用字符串处理函数实例分析
2014/11/22 PHP
php按字符无乱码截取中文的方法
2015/03/27 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
htm调用JS代码
2007/03/15 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
JQuery基础语法小结
2015/02/27 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
前端微信支付js代码
2016/07/25 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
Python和php通信乱码问题解决方法
2014/04/15 Python
Python中的函数作用域
2018/05/07 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
Scrapy框架使用的基本知识
2018/10/21 Python
Python 支付整合开发包的实现
2019/01/23 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
用python实现一个简单的验证码
2020/12/09 Python
python爬虫如何解决图片验证码
2021/02/14 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
初二学习计划书范文
2014/04/27 职场文书
财务会计实训报告
2014/11/05 职场文书
Python软件包安装的三种常见方法
2022/07/07 Python