js中的特殊数值——NaN,+0,-0,Infinity,undefined,null

来源:互联网 发布:win7禁止修改ip软件 编辑:程序博客网 时间:2024/05/29 11:44

一、不是值的值

  1、null 和 undefined
     null类型只有一个值,即null。 undefined类型也只有一个值,即undefined。两者既属于类型也是值。
     null:空值,或者没有值;
     undefined:没有定义的值,即从未赋过值;
     其中null不是标识符,而undefined是一个标识符。所以可以当做变量来使用(即可以赋值)。
     在非严格模式下     
      var undefined = 1;//给undefined赋值为1
     在严格模式下允许在局部给undefined赋值
    (function(){    let undefined = 2;            console.log(undefined);//2    }())
   上述例子通过IIFE(立即执行函数表达式)生成一个局部作用,在作用域内修改undefined值。
   但!永远不要修改undefined值,这会带来很多未知的麻烦。
  2.void
   通过void运算符可以得到undefined值;
    var a=1;    console.log(void a);//undefined
    当我们需要将一些值设为undefined时就用的到void.
    比如在等待时,我们通常会设置一个setTimeout()来实现一些等待时的操作,而setTimeout()函数会返回一个数值ID,有时候这会带来麻烦。如下:
function waiting(){    if( !ready ){    return setTimeout( waiting,1000 );    }    return signal;}if( waiting ){//执行下一步}
  简单的设计思路:当没有准备好时(如还在加载中),执行一个setTimeout,一直等到准备完成时,返回出一个信号给下一步操作。但是上述代码在实际执行时却不同于预期,它会在第一次执行完setTimeout时就执行下一步。因为
setTimeout()函数会返回一个数值ID,为真值。这时我们就需要void来为我们扫除那些没必要的返回值。
function waiting(){    if( !ready ){    return void setTimeout( waiting,1000 );    }    return signal;}if( waiting ){//执行下一步}

二、特殊数字

1、NaN
  NaN 全称‘not a number’,不是个数字。这样的翻译不是那么准确。
  typeof( NaN );//number
  通过typeof可以看到NaN是一个数值,所以应该叫‘不是数字的数字’可能会好些。
  NaN是唯一一个非自反的值。
  可以通过isNaN来查看一个数据是不是NaN。
  isNaN( NaN );//true  isNaN( 1/'aaa' );//true  isNaN( 1 );//false  isNaN( 'aaa' );//true????
  NaN本质上是一个数,但是通过isNaN把字符串也归为NaN,这显然是不正确的。这个错误同typeof( null )返回object一样从js诞生存在到了现在。好在ES6中加了一个工具函数Number.isNaN(),它可以正确判断NaN。
   Number.isNaN( NaN );//true  Number.isNaN( 1/'aaa' );//true  Number. isNaN( 1 );//false  Number. isNaN( 'aaa' );//fals

 ES6之前的浏览器的polyfill如下
if (!Number.isNaN){Number.isNaN = function(n) {return (typeof n === "number" &&& window.isNaN( n ));};}
2、Infinity(无穷) 
  在js中可呈现的浮点数为(5e-324,1.798e+308)超过上限的都为Infinity,负值为-Infinity。
var a = 1/0;//Infinityvar b = -1/0;//-Infinitya - 1    //Infinitya + 1   //Infinitya * 5   //Infinitya / 5    //Infinitya -  a   //NaNa + a   //Infinitya * a   //Infinitya / a    //NaN
计算结果一旦为无穷数就无法再通过计算得到有穷数。即可以从又穷变为无穷,但不能从无穷变为又穷。一旦涉及后者的操作,结果均为NaN。
3、+0,-0,0
  在JavaScript中有一个常规的0,也叫作+0。也存在一个-0。
var a = 0 / -1; //-0var b = 0 * -1;//-0
根据规范-0在字符串化时会返回"0"
a.toString(); //0a + '';           //0string( a );   //0//json也是JSON.stringify( a );//0 
但是在字符串转换成数字时,得到的结果是准确的。
+ "-0";                   //-0Number( "-0" );           //-0JSON.parse( "-0" );       //-0
它的比较操作也很怪异
0 === -0;//true0 == -0;   //true0 > -0;     //false
那么怎么区分-0和+0呢?
function isNegZero(n){    n = Number( n );    return (n === 0) && (1 / n === -Infinity);}isNegZero( -0 );//trueisNegZero( 0 );//false

4、绝对相等

   通过上述我们了解到,NaN和自身不相等,而-0等于0。那么怎么判断两个数是否绝对相等呢?
   好在ES6中新增了一个方法Object.is(),可以用来判断两个值是否绝对相等。
Object.is( 0, -0 );//falseObject.is( NaN, NaN );//trueObject.is( -0, -0 );//true
  在ES6之前也可以写一个简单的判别函数
//关于两个值是否绝对相等object1is = function(v1,v2){if (v1 === 0 && v2 === 0){return 1 / v1 === 1 / v2;}else if (v1 !== v1){return v2 !== v2;}else return v1 === v2;}object1is( NaN, NaN );//trueobject1is( NaN, 1 );//falseobject1is( -0, +0 );//falseobject1is( -0, -0 );//trueobject1is( 6, 5 );//false








    
原创粉丝点击