null

null 表示一个变量被声明了,并被赋值为空

var lzh = null;
console.log(lzh); // null
console.log(typeof lzh); // object

undefined

简单的理解:
undefined 表示一个变量被声明了,但是还没有赋值,比如:

var lzh;
console.log(lzh); // undefined
console.log(typeof lzh); // undefined

详细一点的理解:
在 JavaScript 中,有 Undefined 类型, undefined 值和 undefined 变量

Undefined 类型

这是 JavaScript 五中基本数据类型中的一种,一个值为 undefined 的变量,类型为 Undefined 类型

undefined 值

  • 声明的变量没有赋值,则默认赋值为 undefined
  • 属性没有被赋值,则默认赋值为 undefined
  • 函数没有返回值(没有返回语句或者只有一个 return;),则默认返回 undefined
  • 函数的参数没有提供时,形参为 undefined
var a;
typeof a; //"undefined"

window.b;
typeof window.b; //"undefined"

var c = (function() {})();
typeof c; //"undefined"

var d = (function(e) {return e})();
typeof d; //"undefined"

undefined 变量

undefined 变量是全局的属性,我们也可以通过变量的形式来访问,暂且称它为变量吧,如果对变量和属性有疑惑,文后附上了介绍很详细的博文。

typeof undefined; //"undefined"

var f = 2;
f = undefined; //将 undefined 变量的值付给 f
typeof f; //"undefined"

在 ES3 里面,undefined 是可写的,如下:

undefined = "washing machine"; //向 undefined 变量赋值一个字符串
typeof undefined //"string"

f = undefined;
typeof f; //"string"
f; //"washing machine"

相似之处

  1. null 和 undefined 强制类型转换成布尔型时,都是 false
  2. null == undefined //true ,但这并不是由第一点导致的,虽然原因也是强制类型转换,下一篇博文会有我的理解。

更多(by RedNax)

设置一个值为 null 是合理的
如 objA.valueA = null;但设置一个值为 undefined 是不合理的,如 objA.valueA = undefined; // 应该直接使用 delete objA.valueA;
任何一个存在引用的变量值为undefined都是一件错误的事情。

JS 中同时存在 undefined 和 null 是合理的。
首先在 Java 中不存在 undefined 是很合理的:Java 是一个静态类型语言,对于 Java 来说不可能存在一个“不存在”的成员(不存在的话直接就编译失败了),所以只用 null 来表示语义上的空值。而 JavaScript 是一门动态类型语言,成员除了表示存在的空值外,还有可能根本就不存在(因为存不存在只在运行期才知道),所以这就要一个值来表示对某成员的 getter 是取不到值的。

typeof null 结果是 ”object“ 更像是一个设计失误
因为 typeof null === "object" 而认为 null 语义是表示空对象是个不谨慎的猜测,感觉像是先射箭后画靶一般。简单的反例:在强类型数据交换协议 odata( http://www.odata.org/ )的 JSON 格式中,即使一个成员定义为特定类型(比如string),也可以设置其值为 null 来表示这个值是空值,这可不是表示这个成员是空对象,只是说值为空而已(和空字符串、0、false有所区别)。而 typeof null === "object" 更可能是一个设计失误,所以在 harmony 中有提议将这个返回值修正为 null :
http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null
当然该提议因为会造成大量旧 Javascript 脚本出现问题而被否决了……

参考

https://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/
https://javascriptweblog.wordpress.com/2010/08/09/variables-vs-properties-in-javascript/
http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html

JavaScript null 和 undefined的更多相关文章

  1. Javascript null和undefined

    Javascript的数据类型包括数字.字符串.布尔值.null.undefined和对象.其中null和undefined是两种特殊的原始类型,很容易混淆.今天就来剖析一下null和undefine ...

  2. JavaScript null和undefined的区别

    前言 1995年javascript诞生时,最初像Java一样,只设置了null作为表示"无"的值.根据C语言的传统,null被设计成可以自动转为0 但是,javascript的设 ...

  3. JavaScript null and undefined

    http://stackoverflow.com/questions/6429225/javascript-null-or-undefined var x; x == null // true x = ...

  4. javascript null vs undefined

    这个是很古老的问题了. 一直存在争议,有些人认为,很多语言没用 undefined 也活的好好,为啥要 undefined 呢. 那有了 undefined 是否还需要 null 呢 ? typesc ...

  5. 【阿里李战】解剖JavaScript中的 null 和 undefined

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位 ...

  6. 细说Javascript之null、undefined和NaN

    首先简单介绍一下Javascript中的数据类型,Javascript中的数据类型有undefined,boolen,number,string和object等5种,前4种是原始类型,第5种是引用类型 ...

  7. 【温故而知新-Javascript】比较 undefined 和 null 值

    JavaScript 中有两个特数值: undefined和null,在比较它们的时候需要留心.在读取未赋值的变量或试图读取对象没有的属性时得到的就是 undefined 值. <!DOCTYP ...

  8. Javascript 中的false、0、null、undefined和空字符串对象

    在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象——false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来 ...

  9. 区别Javascript中的Null与Undefined

    在JavaScript中存在这样两种原始类型:Null与Undefined.这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined? Undef ...

随机推荐

  1. iOS开发——九切片

    这个虽然就我来说,感觉它没啥用,但还是放这吧,有时间了把内容补上.

  2. angular中的$http配置和参数

    依赖:$httpBackend $cacheFactory $rootScope $q $injector 使用:$http(config); 参数: method:字符串,请求方法. url:字符串 ...

  3. Java-JNA调用DLL(转)

    源:JNA调用DLL 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的J ...

  4. RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

    上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...

  5. limesurvey设置短调查问卷url

    If you want to use fancy URLs and so not have /index.php in every URL please edit /application/confi ...

  6. CentOS 7 上面安装PowerShell

    看了文章 爱上PowerShell , 就想在CentOS 7上面试试PowerShell , 本文记录了在CentOS 7.2上安装Powershell 的过程. 首先我们要从github上下载最新 ...

  7. spark使用总结

    背景 使用spark开发已有几个月.相比于python/hive,scala/spark学习门槛较高.尤其记得刚开时,举步维艰,进展十分缓慢.不过谢天谢地,这段苦涩(bi)的日子过去了.忆苦思甜,为了 ...

  8. $(function(){})和$(document).ready(function(){}) 的区别

    document.ready和onload的区别——JavaScript文档加载完成事件 页面加载完成有两种事件 一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件) 二是onloa ...

  9. Chrome调试大全

    作为一名前端开发者,打交道最多的可能是和浏览器.市面上各种浏览器多不胜数,主流的有Chrome,Firefox,Safari,IE,Opera,非主流的如360,遨游,QQ浏览器,搜狗浏览器,据说淘宝 ...

  10. easyui datagrid行中点击a标签链接,行被选中,但是获取不到对应的参数

    easyui中使用比较多的就是datagrid了,表格中添加连接,点击跳转,为比较常用的方式;往往在点及标签后调用getSeleted方法会失效; 一.初始代码: {field: 'id',title ...