• 数值转换之Number()


    Number()适用于任何类型转换为数值类型(number)

    5大基本数据类型:number,string,Boolean,undefined,null
    1种复杂数据类型:object

    参数为Boolean

    true --- 1
    false --- 0

    参数为number

    简单的传入和返回,实际不做任何操作

    参数为undefined

    返回NaN

    参数为null

    返回0,null表示空对象指针,是特殊的

    参数为string

    1. 字符串只含正负号和数字,会直接转换为相应整数,忽略前导0。如果还含有其他字符,返回NaN。
    Number("-0123");  //-123
    Number("12adc");   //NaN
    
    1. 浮点数,与第1点类似
    Number("3.12");   //3.12
    Nmuber("3.12x");  //NaN
    Nmuber("0003.12");  //3.12
    Number("1.2e4");  //12000
    
    1. 可正常转换十六进制数,由于Number会忽略前导0,所以不能进行8进制数转换
    Number("0x12");   //18
    Number("080");    //80
    
    1. 空字符串则返回0
    Number("");   //0
    

    Number()对参数为字符串的转换是很严格的,字符串内若含有与number类型无关的字符,结果都会是NaN

    参数为对象

    当参数为对象时,将返回NaN,除非包含单个数值的数组

    Number([5]);   //5
    

    对于对象执行Number()函数,经历以下步骤:
    对象先调用自身方法valueOf(),如果返回原始类型的值,则执行Number函数,如果返回的还是对象(可以用typeof查看返回类型),则换作调用自身方法toString(),再执行Number函数,此时按照参数是字符串类型来处理。

    var obj = {x: 1};
    Number(obj) // NaN
    // 等同于
    if (typeof obj.valueOf() === 'object') {
      Number(obj.toString());
    } else {
      Number(obj.valueOf());
    }
    

    默认情况下,对象的valueOf方法返回对象本身,所以一般总是会调用toString方法,而toString方法返回对象的类型字符串(比如[object Object]

    验证:

    function myObj(){}
    
    myObj.prototype.valueOf = function(){ return "1" }
    
    myObj.prototype.toString = function(){ return "2" }
    
    var obj = new myObj(); 
    Number(obj); //1
    
    //然后修改valueOf(),使其返回对象本身 
    myObj.prototype.valueOf = function(){ return this;}
    obj.valueOf();               //myObj()
    Number(obj);                 //2
    

    其他例子:

    var a = [1,2];
    var b = [5];
    a.valueOf();       // (2) [1, 2]
    typeof a.valueOf();         //"object"
    b.valueOf();       //[5]
    typeof b.valueOf();   //"object"
    //valueOf()的返回值是对象类型,继续调用toString()
    a.valueOf().toString();      //"1,2"
    b.valueOf().toString();      //"5"
    //分别对调用toString()后的结果执行Number()
    Number([1,2].valueOf().toString());  //NaN
    Number([5].valueOf().toString());  //5
    

    由于对象的valueOf和toString方法是可以自定义的,当方法是返回数值类型时,根据返回值的不同就可以确定两个方法的调用顺序:

    Number({
      valueOf: function () {
        return 2;
      }
    })
    // 2
    
    Number({
      toString: function () {
        return 3;
      }
    })
    // 3
    
    Number({
      valueOf: function () {
        return 2;
      },
      toString: function () {
        return 3;
      }
    })
    // 2,valueOf先于toString
    

    感谢阅读!

    参考:JavaScript 教程/语法专题/数据类型的转换

  • 相关阅读:
    idea gson使用
    spring对象工具类
    java反射判断对象空字段
    说说沟通乱这件事
    RandomShuffleQueue
    学习材料
    python异常处理
    tensorboard基础使用
    深度学习——特殊应用:人脸识别和神经风格转换[13]
    深度学习——目标检测[12]
  • 原文地址:https://www.cnblogs.com/liulangbxc/p/14489859.html
Copyright © 2020-2023  润新知