理解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实现win8一样酷炫的动态磁贴效果(示例代码)
Jul 13 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
Oct 24 Javascript
一个检测表单数据的JavaScript实例
Oct 31 Javascript
jQuery.holdReady()方法用法实例
Dec 27 Javascript
js实现短信发送倒计时功能(正则验证)
Feb 10 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
Mar 01 Javascript
微信分享调用jssdk实例
Jun 08 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 jQuery
信息滚动效果的实例讲解
Sep 18 Javascript
浅谈HTTP 缓存的那些事儿
Oct 17 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
May 08 Javascript
vscode vue 文件模板的配置方法
Jul 23 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 zip文件解压类代码
2009/12/02 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
2016/05/17 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
[06:21]2014DOTA2国际邀请赛 庆祝VG首阶段领跑;B叔为挣牛排半夜整理情报
2014/07/13 DOTA
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
Python基础之函数的定义与使用示例
2019/03/23 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
小学感恩主题班会
2015/08/12 职场文书
2016年大学生就业指导课心得体会
2015/10/09 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书