JavaScript的数据类型大体分为两类:原始类型和对象类型。其中,原始类型包括数字、字符串和布尔值。此外,JavaScript中还有两个特殊的原始值:null(空)和undefined(未定义),它们不是数字、字符串和布尔值,它们通常分别代表各自特殊类型中唯一的成员。

null

null是JavaScript语言的关键字,它表示一个特殊值,常用来描述“空值”。对null执行typeof预算,结果返回字符串“object"(如下图),所以说,也可以将null认为是一个特殊的对象值,它的含义是“非对象”。但实际上,通常认为null是它自有类型的唯一的一个成员,它可以表示数字、字符串、对象是“无值”的。

typeof(null); // object

undefined

undefined也可以用来表示值的空缺。它和null不一样,它不是关键字,它是变量的一种取值,表明变量没有初始化,在查询对象的属性或数组元素的值时返回undefined,则说明这个属性或元素不存在。如果函数没有返回任何值,则返回undefined。引用没有提供实参的函数形参的值也只会得到undefined。undefined是预定义的全局变量,它的值就是“未定义”。

null和undefined相同之处

null和undefined都是完全不可变的值,都没有属性和方法,也不能给它们添加属性或者赋值(因为它们根本没有属性)。如果试图定义一个属性将会引发一个类型错误(如下图),它们是完全无效的值。

在JavaScript中,“没有值”代表的布尔值是false,这意味着他们在条件上下文中会被被计算为false,如if语句中。

注意:使用相等操作符( == )比较这两个值和其他false值是不相等的,如果比较它们两个是相等的,但是不全等(===),因为类型不一样。

疑问:既然null和undefined在if判断语句中都表示为false,为什么不能和false值相等呢?

用等于(==)操作符将false对象和其他对象进行比较的时候,会发现,只有0和空字符串等于false;undefined和null对象并不等于false对象,而null和undefined是相等的。所以,可以把0、空字符串和false归为一类,称为“假值”;把null和undefined归为一类,称为"空值"。(个人理解:也就是说在JavaScript中,假值和空值都有一个共性,那就是在作为if的条件分支时,均被视为false ;应用"!"操作之后得到的均为true )

举例说明一下:

if语句中,null举例说明

if语句中,undefined举例说明

null和undefined区别

null和undefined基本是同义的,只有一些细微的差别。

1、null是一个表示“没有”的对象,转为数值时为0;undefined是一个表示"未定义"的原始值,转为数值时为NaN。

2、null表示“没有对象”,即该处不应该有值。undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。

3、null和undefined通过typeof判断出的结果不一样。

备注:有资料显示,typeof的这种行为已经被确认为一个错误,虽然提出了修正,出于后兼容的目的,这一点已经保持不变。

 

扩展:

    在ECMAScript 3中,undefined是可读/写的变量,可以给它赋任意值。这个错误在ECMAScript 5中做了修正,undefined在该版本中是只读的。

null经常被用于显式地指定变量为无效(object= null)当一个引用不再是必需的,通过分配null值,有效地清除引用,并假设对象没有引用其他代码,指定垃圾收集,确保回收内存。有时也会在定义变量时,初始化为null;

undefined很少或者说不建议用在任何地方,undefined经常会出现在许多的方法代码中。通常遇到当试图访问一个不存在的值时,只会默认返回一个undefined值,而不是上升为一个错误。 任何声明变量时没有提供一个初始值,都会有一个为undefined的默认值。

总结:可以把undefined认为是表示系统级的、出乎意料的、或者是类似错误的值的空缺,而null是表示程序级的、正常的或在意料之中的值的空缺。如果想把它们赋值给变量或者属性,或将它们作为参数传人函数,最佳选择是使用null。

JavaScript中null和undefined的更多相关文章

  1. JavaScript中Null和Undefined的深渊

    探索JavaScript中Null和Undefined的深渊 当讨论JavaScript中的原始数据类型时,大多数人都知道的基本知识,从String,Number到Boolean.这些原始类型相当简单 ...

  2. JavaScript中null和undefined的总结

    先说null,它表示一个特殊值,常用来描述“空值”.对null执行typeof运算,结果返回字符串“object”,也就是说,可以将null认为是一个特殊的对象值,含义是“非对象”(感觉怪怪的).实际 ...

  3. 探索JavaScript中Null和Undefined的深渊

    当讨论JavaScript中的原始数据类型时,大多数人都知道的基本知识,从String,Number到Boolean.这些原始类型相当简单,行为符合常识.但是,本文将更多聚焦独特的原始数据类型Null ...

  4. JavaScript中Null和Undefined的区别

    Null: null是js中的关键字,表示空值,null可以看作是object的一个特殊的值,如果一个object值为空,表示这个对象不是有效对象. Undefined: undefined不是js中 ...

  5. Javascript 中 null和undefined的区别

    null表示"没有对象",即该处不应该有值.典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. (2) 作为对象原型链的终点. Object.getPrototype ...

  6. javascript中null与undefined的区别

    1.null null是一个对象,表示一个空对象指针,typeof(null)返回object,null参与运算时会转化为0,将对象初始化为null,可以知道变量是否保存了对象的引用 2.undefi ...

  7. JavaScript typeof, null, 和 undefined

    typeof 操作符 你可以使用 typeof 操作符来检测变量的数据类型. 实例 typeof "John"                // 返回 string typeof ...

  8. JavaScript中调皮的undefined

    JavaScript中调皮的undefined 在JavaScript中undefined只是一个标识符,不是关键字,这个很不靠谱的标识符还不能像其他符号一样随意使用,一方面是需要它的原始值保持不变, ...

  9. JavaScript中 null 的 typeof是object

    JavaScript中  null 的 typeof是object

随机推荐

  1. libvlc media player in C# (part 2)

    原文 http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/ I gave some simplified VLC media play ...

  2. Windows在结构objective C开发环境

    对于近期打算iPhone.iPod touch和iPad开发一些应用程序,所以.需要开始学习Objective C(苹果推出的类似C语言的开发语言).因为苹果的自我封闭的产业链发展模式(从芯片.机器. ...

  3. ubuntu安装nVidia驱动,遇到终端闪砾问题并解决

    安装nvidia的官方驱动之后,比起nouvean来说感觉速度快了不少. 安装该驱动很简单,但选择哪个驱动是要注意的.因为今天我试了nvidia的多个驱动后都在ubuntu下用起来并不好. 我现在的环 ...

  4. [译]Java垃圾回收器的类型

    说明:这篇文章来翻译来自于Javapapers 的Types of Java Garbage Collectors 在这部分的教程中我们将讲到可使用的四种不同类型的Java垃圾回收器.垃圾回收是Jav ...

  5. 【剑指offer】的功率值

    标题叙述性说明: 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数.同一时候不须要考虑大数问题. 分析描写叙述: ...

  6. 什么是Solr搜索

    什么是Solr搜索 一.Solr综述   什么是Solr搜索 我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理. 当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂. ...

  7. leetcode[90] Decode Ways

    题目:如下对应关系 'A' -> 1 'B' -> 2 ... ‘Z’ -> 26 现在给定一个字符串,返回有多少种解码可能.例如:Given encoded message &qu ...

  8. Linq to sql与EF零碎知识点总结

    ------------------------------第一天(2013-3-25) 1.ado.net实体模型,(Ef) 2.创建上下文对象: 调用相应方法,最后调用.savechanges() ...

  9. .NET代码自动编译发布

    .NET代码自动编译发布   因本人一直使用.NET开发,在做项目的时候,每次都要涉及到各个环境的部署问题,手工操作容易出错,并且重复劳动多,所以一直在寻找一个能实现自动化部署的方案. 废话不多讲,先 ...

  10. Linux : fedora 安装 vnc server

    Linux配置VNC服务 安装VNC服务端 #yum install vnc-server 配置VNC服务参数文件 编辑vncservers文件追加如下 #vi /etc/sysconfig/vncs ...