理解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 相关文章推荐
JavaScript 设计模式学习 Factory
Jul 29 Javascript
jquery弹出框的用法示例(一)
Aug 26 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
Aug 28 Javascript
把字符串按照特定的字母顺序进行排序的js代码
Jan 28 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
Aug 22 Javascript
学习AngularJs:Directive指令用法(完整版)
Apr 26 Javascript
jQuery grep()方法详解及实例代码
Oct 30 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
Apr 18 Javascript
基于angular实现三级联动的生日插件
May 12 Javascript
Vue工程模板文件 webpack打包配置方法
Dec 26 Javascript
Vue 框架之动态绑定 css 样式实例分析
Nov 14 Javascript
ant-design-vue 实现表格内部字段验证功能
Dec 16 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
PHP个人网站架设连环讲(二)
2006/10/09 PHP
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
2010/06/04 PHP
第三章 php操作符与控制结构代码
2011/12/30 PHP
js清空form表单中的内容示例
2014/05/20 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
2014/12/08 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
[01:44]Ti10举办地公布
2019/08/25 DOTA
详解Python网络爬虫功能的基本写法
2016/01/28 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
环保建议书600字
2014/05/14 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js