null 和 undefined

null 和 undefined_第1张图片
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

你可能感兴趣的:(null 和 undefined)