理解Javascript__理解undefined和null

来自普遍的回答:

其实在 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代表没有赋值的引用数据类型。

我们来看一段代码:


1

2

3

4

5

6

7

8

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)两种情况的

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

如何判断一个变量是否存在,当
(1)变量声明未定义
(2)变量为声明
(3)变量声明,并为其赋值为undefined时候(不是字符串“undefined”)

undefined与参数判断

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


1

2

3

4

5

6

function bool(val){

       if(typeof val == ‘undefined‘){

            return true;

        }

        return !!val;

}

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


1

2

alert(bool(undefined));//true

alert(bool());//true

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


1

2

3

4

5

6

function bool(val){

    if(arguments.length !==0){

        return !!val;

    }

    return true;   

}

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

时间: 2024-12-23 11:10:35

理解Javascript__理解undefined和null的相关文章

来理解undefined 和 null 区别

之前虽然也知道这两个之间的区别,但是让我描述的话,感觉上还是说的不是很清楚.今天也详细看了一次这个知识点,现在来说说这两者间的区别. null: Null类型,代表"空值",代表一个空对象指针,使用typeof运算得到 "object",所以你可以认为它是一个特殊的对象值. undefined: Undefined类型,当一个声明了一个变量未初始化时,得到的就是undefined. null是javascript的关键字,可以认为是对象类型,它是一个空对象指针,和其

怎样理解undefined和 null

前言: undefined表示 "未定义", null 表示 "空" 第一步: 一般在变量或属性没有声明或者声明以后没有赋值时, 这个变量的值就是undefined; typeof a; // "undefined"; var b; typeof(b); // "undefined"; var c = {}; typeof(c.name); // "undefined"; 第二步: null是检测变量指向的

JavaScript:undefined And null差异

班吃饭的时候,同事偶然问了一个问题:undefined和null究竟有什么差别?无法回答,回去查阅相关文档,算了有了一个了解,做相关的总结.在開始之前,请看例如以下代码,算是抛出这个问题: console.info(undefined == null); //true console.info(undefined === null); //false 上述结果能够给我们一个这种理解: undefined和null两个值相等,可是他们含义不同.详细两者有什么差别,先理解下undefined和nul

javascript中undefined和null的区别详解

一.问题的由来 永远不要直接使用undefined进行变量判断使用字符串"undefined"对变量进行判断 这里,undefined是原始值,在JS中undefined出现只有两种情况,一种是变量未定义.一种是定义了变量,但是没有赋值. 如果这个地方person未定义,那么利用person===undefined全等判断就会报错,person未定义但是如果使用typeof来判断,那么就不会报错了. ep: alert(person == undefined);//报错 person

理解Javascript_01_理解内存分配

理解Javascript_01_理解内存分配 转载自:http://www.cnblogs.com/fool/archive/2010/10/07/1845226.html 在正式开始之前,我想先说两句,理解javascript系列博文是通过带领大家分析javascript执行时的内存分配情况,来解释javascript原理,具体会涵盖javascript预加载,闭包原理,面象对象,执行模型,对象模型...,文章的视角很特别,也非常深入,希望大家能接受这种形式,并提供宝贵意见. 原始值和引用值

JavaScript:undefined And null区别

下班吃饭的时候,同事偶然问了一个问题:undefined和null到底有什么区别?无法回答,回去查阅相关资料,算了有了一个了解,做相关的总结,在开始之前,请看如下代码,算是抛出这个问题: console.info(undefined == null); //true console.info(undefined === null); //false 上述结果可以给我们一个这样的理解: undefined和null两个值相等,但是他们含义不同.具体两者有什么区别,先理解下undefined和nul

关于undefined,null,NaN,以及引用值的一点小记

在JavaScript中,undefined以及null同样是表示空值(没有实际意义). undefined == null; 事实上,上面这段代码的返回结果也是true,然后他们俩有什么区别吗,首先是语义上面的区别,undefind在JavaScript中表示的是已经声明了,但是没有赋值,相当于是对只是被声明了的状态的表示,是的没错,我更愿意把他理解为一种状态,而null就更像是一个值了,他表示的就是一个空,就是啥都没有,实际上也是一种状态(至少我是这么理解的). NaN也是一个比较有趣的值.

理解Javascript_07_理解instanceof实现原理 【转】

在<Javascript类型检测>一文中讲到了用instanceof来用做检测类型,让我们来回顾一下: 那么instanceof的这种行为到底是如何实现的呢,现在让我们揭开instanceof背后的迷雾. instanceof原理 照惯例,我们先来看一段代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 function Cat(){} Cat.prototype = {} function Dog(){}

前端面试准备2----Javascript中的Undefined和null小结

JavaScript中有两个表示“空”的值,分别是Undefined和null: (1)Undefined 定义了一个全局变量,它的值是 undefined,这个变量也被称为undefined. 但是这个变量不是一个常量,也不是一个关键字.这意味着它的值可以轻易被覆盖. ES5 提示: 在 ECMAScript 5 的严格模式下,undefined 不再是可写的了. 但是它的名称仍然可以被隐藏,比如定义一个函数名为 undefined. 下面的情况会返回 undefined 值: 访问未修改的全