• JavaScript中的各种小坑汇总


    1、Number()将部分非数字类型转换为0

    强制转换为数值类型函数:

    parseFloat、parseInt

    优点:对非数值类型统一返回NaN

    缺点:会将一部分符合数值类型的字符串也识别为数值

    parseFloat("1")//1
    parseFloat("1s")//1,不是想要的
    parseFloat(null)//NaN
    parseFloat(undefined)//NaN
    parseFloat("")//NaN

    Number

    优点:对于字符串必须全部符合数值类型才会转换成功

    缺点:会将部分非数值类型转换为0

    Number("1")//1
    Number("1s")//NaN
    Number(null)//0,不是想要的
    Number(undebug)//NaN
    Number("")//0,不是想要的

    其中Number(null)和Number(“”)都会返回0,而不是NaN,从而导致了各种bug。

    判断是否是数值类型的解决方案

    使用jquery提供的$.isNumeric函数判断。

    $.isNumeric("1")//true
    $.isNumeric("1s")//false
    $.isNumeric(null)//false
    $.isNumeric(undefined)//false
    $.isNumeric("")//false

    全部正确,附jquery的$.isNumeric函数源码:

    isNumeric: function( obj ) {
        // parseFloat NaNs numeric-cast false positives (null|true|false|"")
        // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
        // subtraction forces infinities to NaN
        // adding 1 corrects loss of precision from parseFloat (#15100)
        return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
    },

    2、"".split(",")函数会返回长度为1的数组

    在说这个问题提之前需要先说下split函数的几种特殊值的情况。

    字符串的split函数的特殊值情况

    1、参数不传,返回包含原字符串对象,长度为1的数组。

    "".split()//[""]
    "xxcanghai".split()//["xxcanghai"]

    2、参数传空字符串,返回将原字符串每个字符分隔的数组

    若原字符串为空字符串则返回空数组

    "".split("")//[]
    "xxcanghai".split("")//["x", "x", "c", "a", "n", "g", "h", "a", "i"]

    3、原字符串为空字符串,参数不为空时,会返回包含一个空字符串的数组

    "".split(",")//[""],错误,应为[]
    "".split("xxcanghai")//[""],错误,应为[]

    可见,原字符串长度为0,且分隔符长度大于0时,会返回一个包含空字符串的数组。

    因为这个问题,导致了各种各样的bug。

    待续…

  • 相关阅读:
    Python--关于dict
    数据结构之线性表的实现
    js数据类型检测小结
    javascript的执行机制—Event Loop
    深入理解理解 JavaScript 的 async/await
    操作系统管理CPU的直观想法
    入门Promise的正确姿势
    javascript的数据类型转换
    JS预编译详解
    如何去封装一个Ajax库
  • 原文地址:https://www.cnblogs.com/xxcanghai/p/5163020.html
Copyright © 2020-2023  润新知