null 和 undefined

null And undefined

总而言之,JavaScript中的基本类型(基本类型指它们的值不是一个目的并且没有此外措施)为:String/Number/Bool/Null/Undefined/Symbol
(ECMAScript 2015剧增)

前二种是很容易弄明白的,不过Null/Undefined总是相互纠缠,让人弄不知晓。在此以前从来尚未在意Null

Undefined类型根本的反差,只是简单的垂询一下,前几天被面试官问到:请说一下null
和 undefined的区分
。我张了谈话,竟然没法准确地答出来。

回去翻了翻各样资料,包括MDN上的素材、ECMAScript规范、红宝书,发现这还真是一个世界性难题。

正式中的描述:


ECMAScript-262 3th
Edition
:

4.3.9 Undefined Value
The undefined value is a primitive value used when a variable has not
been assigned a value.
// undefined是一个原始值,一个变量尚未被分配一个值时会拔取到它

4.3.11 Null Value
The null value is a primitive value that represents the null, empty,
or non-existent reference.
// null是一个原始值,被用来表示零、空或者不存在的引用

ECMAScript-262 5th
Edition

And 6th
Edition
(相较于3th版基本没有改观):

4.3.9
undefined value
primitive value used when a variable has not been assigned a value.
// 原始值,一个变量尚未被分配值时会被运用到
4.3.11
null value
primitive value that represents the intentional absence of any object
value.
// 原始值,表示对其它对象值的有意的缺失

MDN文档中的描述:


  • undefined
    一个未被赋值的变量默认是Undefined类型。函数没有再次来到值也会回去undefined
    PS:[undefined也是大局对象的一个性质。这多少个特性的的起初值是基本值undefined
    在现世浏览器当中,undefined全局属性在ECMAScript 5
    规范中的定义是一个不可被布置、不可被写的特性。
    ]
  • null
    null值是一个字面量(不像undefined可以是大局对象的一个性质)。
    null每每被用来表示一个对象应该存在但是并未对号入座的连锁项。

typeof  null  // object (bug in ECMAScript, should be null)
typeof undefined  // undefined
null === undefined // false
null == undefined // true

JavaScript高级程序设计里的叙说:

  • 在动用var生命变量但未对其再说伊始化时,这一个变量的值就是undefined
  • 从逻辑角度来看,null值表示一个空对象指针,而这也正是利用typeof操作符检测null值会再次来到object的原故(那里表明的不够规范,现在普遍认为这是ECMAScript中的一个bug)。假诺定义的变量准备在未来用于保存对象,那么最好将该变量起头化为null而不是任何值。

疑惑点:


  • null与空指针

5 + null   // 5
5 + undefined  //NaN

null在任何语言中日常被用来当作空指针使用。空指针是一个异样的指针值。指针变量具有空指针值,表示它顿时处在闲置状态,没有针对性任何有含义的东西。空指针指向内存的0地址,不过0地址附近的半空中是归操作系统所有,另外指向是不容许利用的。所以指针指向0地址是为着使指针指向一个已知的地点避免成为野指针。

这样考虑下来在JS当中参预数字运算的时候,把null值转换成0也不是从未有过道理,而undefined就从未这层含义了,所以不可以参加和数字的运算,可是值得注意的是:

parseInt(null)  // NaN
parseInt(undefined)  // NaN
  • undefined与undeclared

    undefined
    代表一个变量被声称(declared),但未被赋值。(不意味着一个变量未被声称!!!可以认为是该变量的值undefined,而不是变量undefined,变量已经定义了)

console.log(a);  // Uncaught ReferenceError: a is not defined 

下面提醒很富有迷惑性,说a not
defined,这就是undefined喽?NONONO!这里是指a未被声称,称之为undeclared更为精确。

var a;
console.log(a) // undefined

地点定义了a,可是未赋值,所以默认值为undefined
专注:请不要手动将一个变量设为undefined,那是绝非意思的,假如不想要它,请把它delete.

typeof a (a是一个从未阐明过的变量或是注脚了没有赋值) 都会冒出undefined;

  • typeof null === ‘object’
    那是ECMAScript中的一个bug,不是意味null是一个对象。曾经有人提出改变那或多或少,但假设改动结果的话,将使众多旧的脚本不可以运转,所以并未接纳。null只是被用来表达这里可以放一个对象的地址,不过当前哪些都没放,是个空指针。

参考资料:

阮一峰先生的稿子(图片也是来源于此文):
http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html

Stack
OverFlow上问题:http://stackoverflow.com/questions/5076944/what-is-the-difference-between-null-and-undefined-in-javascript

ECMAScript规范:http://www.ecmascript.org/

MDN:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/null
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/undefined