《javascript高级程序设计》笔记:Number数值转换

数值转换对个人而言是非常重要的,这也是本人单独拉出来总结的一个原因。在此也仅针对显示转换做点文章,隐式转换同样会单独拉出来总结

有 3 个函数可以把非数值转换为数值:Number()、parseInt()和 parseFloat()。第一个函数,即转型函数 Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值

数值转换—Number()

Number()函数的转换规则如下。

  • 如果是 Boolean 值,true 和 false 将分别被转换为 1 和 0。
  • 如果是数字值,只是简单的传入和返回。
  • 如果是 null 值,返回 0。
  • 如果是 undefined,返回 NaN。
  • 如果是字符串,遵循下列规则:

    • 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即”1″ 会变成 1,”123″会变成 123,而”011″会变成 11(注意:前导的零被忽略了);
    • 如果字符串中包含有效的浮点格式,如”1.1″,则将其转换为对应的浮点数值(忽略前导零);
    • 如果字符串中包含有效的十六进制格式,例如”0xf”,则将其转换为相同大小的十进制整数值;
    • 如果字符串是空的(不包含任何字符),则将其转换为 0;
    • 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。
  • 如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值。
// Boolean
Number(true); // 1
Number(false); // 0

// 数字
Number(12); // 12
Number(012); // 10
Number(0xa1); // 161

// null
Number(null); // 0

// undefined
Number(undefined); // NaN

// string
Number("000011"); // 11
Number("01.1"); // 1.1
Number("0xf"); // 15
Number(""); // 0
Number("Hello world!"); // NaN

// object
Number({a:0}); // NaN toString()后只为"[object Object]"
Number([1,2]); // NaN toString()后值为“1,2”
Number([1]); // 1 toString()后值为“1”

数值转换—parseInt()

由于 Number()函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用的是 parseInt()函数。parseInt()函数在转换字符串时,更多的是看其是否符合数值模式

转换规则:

从第一位**非空字符**开始判断(忽略字符串前面的空格)
    如果找到的第一位不是数字字符或者负号,parseInt() 就会返回 NaN 
        => 用 parseInt()转换空字符串会返回 NaN(Number()对空字符返回 0)
    如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符
parseInt()能够识别出八进制和十六进制
parseInt("1234blue"); // 1234
parseInt(""); // NaN
parseInt("0xA"); // 10(十六进制数)
parseInt(22.5); // 22
parseInt("070"); // 56(八进制数)
parseInt("70"); // 70(十进制数)
parseInt("0xf"); // 15(十六进制数)

你在试验进制问题的时候可能会有疑问,怀疑是不是我弄错了。因为在使用 parseInt()解析像八进制字面量的字符串时,ECMAScript 3 和 5 存在分歧

//ECMAScript 3 认为是 56(八进制),ECMAScript 5 认为是 70(十进制)
var num = parseInt("070");

因此,书中建议在进行数值转换时,指明转换的基数
指明基数后,不需要在数值前添加‘0’或‘0x’

var num1 = parseInt("10", 2); //2 (按二进制解析)
var num2 = parseInt("10", 8); //8 (按八进制解析)
var num3 = parseInt("10", 10); //10(按十进制解析)
var num4 = parseInt("10", 16); //16(按十六进制解析)

数值转换—parseFloat()

转换规则:

从第一位**非空字符**开始判断(忽略字符串前面的空格)
    如果找到的第一位不是数字字符、负号或者小数点,parseFloat() 就会返回 NaN
        => 用 parseFloat()转换空字符串会返回 NaN(Number()对空字符返回 0)
    如果第一个字符是三者之一,则继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符
        => 字符串中的第 一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略

注意:如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后 都是零),parseFloat()会返回整数

parseFloat("1234blue"); // 1234 (整数)
parseFloat("0xA"); // 0
parseFloat("22.5"); // 22.5
parseFloat("22.34.5"); // 22.34
parseFloat("0908.5"); // 908.5
parseFloat("3.125e7"); // 31250000
    原文作者:同梦奇缘
    原文地址: https://segmentfault.com/a/1190000010546415
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞