zoukankan      html  css  js  c++  java
  • 三、关于javascript中的NaN和isNaN()

    本文章内容:

    • 什么是NaN以及产生NaN的场景
    • 关于isNan()方法

    ### NaN是什么?
    NaN(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数为返回数值的情况。
    在javascript中,整数和浮点数统称为Number类型,除此之外Number类型还有一个特殊的值就是NaN,它是对象Number的一个静态属性,通过Number.NaN可以访问到。

    NaN本身有两个非同寻常的特点:

    1. 任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多不计算中可能会导致问题。
    2. NaN与任何值都不相等,包括NaN本身。

    #### 产生NaN的两个场景:
    ##### 1、表达式计算
    一个表达式中有减号(-)、乘号(✖)、或除号(➗)等运算符时,JS引擎在计算之前会试图将表达式的每一项转化为Number类型,使用Number()做转换,如果转换失败则返回NaN

    100 - '1a'; // NaN
    '100' / '10a'; // NaN
    '10a' * 5; //NaN
    undefined - 1; //NaN ===> Number(undefined) NaN
    [] * 10; // 0, ====> Number([]) = 0
    null - 5; // -5 ====> Number(null) = 0
    

    ##### 2、类型转换
    直接使用parseInt、parseFloat或者Number讲一个给数字的值转化为数字时,表达式返回NaN.

    'abc' - 1; // NaN
    parseInt('abc'); // NaN
    parseFloat('abc'); // NaN
    Number('abc'); //NaN
    

    对于数字+字符的值,其转化结果会有不同。

    Number('123abc'); // NaN
    parseInt('123abc'); // 123
    parseInt('123abc45'); // 123
    parseFloat('123.45abc'); // 123.45

    Number转化的是整个值而不是部分值,parseInt和parseFloat只转化第一个无效字符之前的字符串。另外,一元操作符也可以实现与Number相同的作用

    +'123abc'; // NaN
    +'123'; // 123
    +'123.78'; // 123.78
    +'abc'; // NaN

    ### isNaN()
    isNaN()是一个全局方法,它的作用是差一个值是否能被Number()成功转换,如果能转换成功就返回false,否则返回true.

    isNaN(NaN); // true 不能被Number()转换,所有结果为true
    isNaN('123'); // false 能被Number()成功转换,所以IsNaN函数最终返回false
    isNaN('123abc'); // true
    isNaN('123.45ab'); // true

    由上可见,isNaN()方法并不能判断一个值是否为NaN,如果想判断某个值是否为NaN,可以利用NaN不等于自身的特殊性质:

    function selfIsNaN(num) {
        return value != value
    }
    

    但是,在es6中,Number对象上也提供了isNaN()方法,和全局isNaN()不同的是,它用于判断某个值本身是否为NaN,而不需要进行类型转换。用法如下:

    Number.isNaN('123'); // false, 本身不是NaN
    Number.isNaN('abc'); // false, 本身不是NaN
    Number.isNaN(NaN); // true, 是
    

      

  • 相关阅读:
    App架构师实践指南四之性能优化一
    App架构师实践指南三之基础组件
    App架构师实践指南二之App开发工具
    App架构师实践指南一之App基础语法
    Linux下阅读MHT文件
    What Is Docker & Docker Container ? A Deep Dive Into Docker !
    Difference between Docker Image and Container?
    RabbitMQ .NET/C# Client API Guide
    How RabbitMQ Works and RabbitMQ Core Concepts
    Message Queue vs Message Bus — what are the differences?
  • 原文地址:https://www.cnblogs.com/youyang-2018/p/11700486.html
Copyright © 2011-2022 走看看