来自普遍的回答:

其实在 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

再来看一下内存的情况:

解决第一个问题:为什么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)两种情况的

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

-----------------------------更新 2010/11/01 --------------------------------------------

undefined与参数判断

我们行来看一个简单的函数:

function bool(val){if(typeof val == 'undefined'){return true;}return !!val;
}

这个函数有问题吗?有,因为typeof返回undefined值有两种可能,一种是传进来的就是undefined,还有一种是没有传值。

alert(bool(undefined));//true
alert(bool());//true

很明显,bool(undefined)返回了不是我们所期望的false.怎么解决这个问题呢?

function bool(val){if(arguments.length !==0){return !!val;}return true;
}

我们通过arguments参数长度来判断是否传递了参数,从而区分函数传递的参数是undefined,还是根本不就没有传值!

chyingp 

转载于:https://www.cnblogs.com/fool/archive/2010/10/07/1845253.html

理解Javascript_02_理解undefined和null相关推荐

  1. javascript中not defined、undefined、null以及NaN的区别

    [ 前言 ] 从踏入IT行业开始,我就发现技术人员写博客很有必要.如果不写博客,时间久了就像好比天天在外面建房子的人,没有一个自己的房子一样.不管学习紧不紧,工作忙不忙,多动手进行梳理总结,一方面是为 ...

  2. JavaScript:undefined And null差异

    班吃饭的时候,同事偶然问了一个问题:undefined和null究竟有什么差别?无法回答,回去查阅相关文档,算了有了一个了解,做相关的总结.在開始之前,请看例如以下代码,算是抛出这个问题: conso ...

  3. undefined 和 null 有什么区别?

    在理解undefined和null之间的差异之前,我们先来看看它们的相似类. 它们属于 JavaScript 的 7 种基本类型. let primitiveTypes = ['string','nu ...

  4. 下班前几分钟,我彻底弄懂了 undefined 和 null 的区别

    目录 前言 一.基本概念 1.undefined 2.null 二.简单区别 三.表现形式 1.typeof 2.== 与 === 3.Object.prototype.toString.call 4 ...

  5. [JS] undefined、null、ReferenceError的区别、变量作用域问题

    undefined.null.ReferenceError的区别 null表示"没有对象",即该处不应该有值. 典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. ( ...

  6. JS 中如何判断 undefined 和 null

    为什么80%的码农都做不了架构师?>>>    JS 中如何判断 undefined JavaScript 中有两个特殊数据类型:undefined 和 null,下节介绍了 nul ...

  7. undefined 和null的区别?

    null是一个表示"无"的对象,转为数值时为0:undefined是一个表示"无"的原始值,转为数值时为NaN. undefined: (1)变量被声明了,但没 ...

  8. Undefined、Null区别渗透

    Undefined 类型表示未定义,它的类型只有一个值,就是 undefined.任何变量在赋值前是 Undefined 类型.值为 undefined,一般我们可以用全局变量 undefined(就 ...

  9. undefined和null

    undefined == null +null = 0; +undefined = NaN: 沿袭C语言的语法+null=0 typeof undefined === undefined; typeo ...

最新文章

  1. 14PS中的切图基本操作
  2. linux下创建新用户以及删除
  3. tcpdump抓包对性能的影响
  4. asp.net中防止攻击的方法
  5. 蓝牙模块与电脑无线通信--AD测量大电压
  6. c语言学习题,C语言学习题目
  7. python(1):数据类型/string/list/dict/set等
  8. 利用CGLib实现动态代理实现Spring的AOP
  9. (原创总结) Quartus II 的在线调试方法
  10. MyEclipse2015Stable2.0安装破解
  11. Linux里怎么进行路由跟踪,[Linux] traceroute 路由跟踪指令用例
  12. css线条伸缩_CSS3弹性伸缩布局之box布局
  13. 华为云技术开放日(第三季)话题介绍和直播群入口
  14. linux下的vconfig配置_Linux系统下安装配置-OpenLDAP-phpLDAPadmin
  15. SQLSERVER:sqlserver2008r2安装好后,自动提示功能不可以使用
  16. 重磅:GB/T 35273-2020《信息安全技术个人信息安全规范》最新解读
  17. 51.la申请免费统计代码
  18. git clone报错warning:Clone succeeded,but checkout failed
  19. linux脚本date命令,Shell之date命令用法
  20. 市场调查——定性研究方法

热门文章

  1. hping3工具DOS攻击实验
  2. 编程算法 - 将排序数组按绝对值大小排序 代码(java)
  3. hadoop+hive-0.10.0完全分布式安装方法
  4. 增加 processon 免费文件数
  5. 爱立信与中国联通成功完成国内首个LTE三载波聚合大规模部署测试
  6. iOS:多线程技术GCD的使用
  7. XCoreRedux框架:Android UI组件化与Redux实践
  8. Java反射xml数据类
  9. mysql 新建用户无法登陆
  10. Lync Server 2010所需媒体网络流量带宽详解和计算