javascript Null、Undefined 、NaN的联系与区别

相信许多初学 javascript 都会有这种想法: 为什么 javascript 有 null 又有 undefined ,相对 C , C++ ,Java ,他们都是只有 null 而已,为什么 javascript 就不同

一、历史原因

    通过网络搜索得知,1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示"无"的值。根据C语言的传统,null被设计成可以自动转为0。

但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。

    首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示"无"的值最好不是对象。

   其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。

   因此,Brendan Eich又设计了一个undefined。

 二、相似性

现实中我们运用得到 null 和 undefined ,发现两者具有很强的相似性

 

 

1 var a = null;
2 var a = undefined;

 

 以上两个变量赋值,老实说,基本上他们是没多大区别。

我们来看以下代码:

var a = null ;
var b = undefined;
console.log(a == b);
 // true

 

在运算符运算中,两者是等值的,事实上,在if语句判断中 null 和undefined 都会默认为false;那么既然两者含义和用法都如此相似,那么为什么还要设置个undefined 呢? 别着急,我们接下来继续看一段代码:

1 var a = null ;
2 var b = undefined;
3 console.log(typeof(a));
4 console.log(typeof(b));
5 //   object
6 //   undefined

 

从代码中可以看出,a b 赋值 null,undefined 后,通过类型判断得知,a 是一个对象,b 则还是undefined;

目前 null 和 undefined 只有一部分细微的差别 :

  null 表示“没有对象”,典型用法是:

  (1)  用于函数传参,表示函数 参数为一个空对象;
  (2)  作为 函数原型链终点;

 

 

Object.getPrototypeOf(Object.prototype)
// null

 

 undefined 表示 “缺少值”,典型用法是:

 

(1)变量被声明了,但没有赋值时,就等于undefined。

(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。

(3)对象没有赋值的属性,该属性的值为undefined。

(4)函数没有返回值时,默认返回undefined。

   

 1 var i;
 2 i // undefined
 3 
 4 function f(x){console.log(x)}
 5 f() // undefined
 6 
 7 var  o = new Object();
 8 o.p // undefined
 9 
10 var x = f();
11 x // undefined

 

看完 null undefined ,我们再来看看 NaN,还是先看一段代码:

 

1 var a = null ;
2 var b = undefined;
3 var c = NaN;
4 console.log(a==c);  
5 console.log(b==c);
6 console.log(typeof(c));
 //  false
 //  false
//   number

 

从代码看出 NaN 既不是 null, 也不是 undefined,而是一个数字,一个特殊的数字,为什么说是一个特殊的数字呢?

 

1 var c = NaN;
2 var d="hello world";
3 console.log(isNaN(d));
4 console.log(c==NaN);
// true
// false

 

从以上得知,NaN  不等于自己, 那么它是用来表示什么的, W3C  的说法是 NaN 属性用于引用特殊的非数字值, 所以  NaN 常用判断 是否为 一个非数字类型,

无法使用 for/in 循环来枚举 NaN 属性,也不能用 delete 运算符来删除它。NaN 不是常量,可以把它设置为其他值

 

posted @ 2016-08-01 15:02  bentos  阅读(332)  评论(0编辑  收藏  举报