zoukankan      html  css  js  c++  java
  • 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 不是常量,可以把它设置为其他值

  • 相关阅读:
    201521123038 《Java程序设计》 第五周学习总结
    201521123020 《Java程序设计》第4周学习总结
    201521123020 《Java程序设计》第3周学习总结
    201521123020《Java程序设计》第2周学习总结
    Java第十二周学习总结
    Java第十一周学习总结
    Java第十周学习总结
    Java第九周学习总结
    Java第八周学习总结
    Java第七周学习总结
  • 原文地址:https://www.cnblogs.com/benstos/p/5725883.html
Copyright © 2011-2022 走看看