首先给出官方文档对这两个概念的解释来,官方技术文档最可靠呀。
概念该解释解释(what is it )
null的概念解释
MDN: The value null represents the intentional absence of any object value. It is one of JavaScript's primitive values.
ECMA-262: primitive value that represents the intentional absence of any object value
//代表任意对象值有意想变空或者没有的原始值
(自己的翻译写上去,每个人的都有让自己明白概念的翻译)
undefined的概念解释
MDN: The global undefined property represents the primitive value undefined. It is one of JavaScript's primitive types.
ECMA-262: primitive value used when a variable has not been assigned a value//当一个变量没有绑定值时该原始值会被使用
使用方法区别(how to use)
null的使用:
记住:null表示"没有对象,该处的变量没有值"
_有属性的对象想变成空,它想空虚了嘛:
var obj = {name: "rong",age:23};obj = null;
_作为Object对象原型链的终点:
Object.getPrototypeOf(Object.prototype);//null
_调用RegExp.prototype.exec()方法匹配没有结果时会返回null
/x/.exec('aaa');//null
undefined的使用:
记住: undefined是为没有初始化的变量而生的值
_变量未初始化的时候
var message;//undefined
_函数命名了参数,调用时却未提供值
function say(name){alert(name)};
say();//弹出undefined
_在函数中使用了return语句,
历史原因
null 和 undefined都扮演的'无'的角色,为什么要两个来表示呢,如果要明白这个就得问问Brendan Eich,所以要回到设计这时候的历史来。
JavaScript呢也沿用了Java把值分为原始值和对象的方法,也使用了对于“不是对象”的java的值null。这是JavaScript第一个版本时候设计的当时还没有undefiend呢。因为这是10天完成的设计语言所以完美是不可能的再讲当时还没有错误处理机制,一些想不到的案例呢如没有初始化的变量值或者缺少值的属性都要指示一个值来表示,当时null是最好的选择,但是Brendan Eich当时想要避免两种事。
第一:这个值不希望是null
第二:这个值也不希望转换为0
var message;//输出messeg不希望是null
Number(message);//不希望是0而是NaN
所以呢为JavaScript语言增加了udnefiend这个值
null设计缺陷
typeof null //返回结果是 'object'
typeof null//本来是要返回结果'null' bug in EcMAScript ,should be null
如果被修复回去的话,会破坏大量的网站和代码。所以不能修复了。