3.4.5 Javascript之Number类型

Number

Javascript中的数值是基于 IEEE 754标准的双精度64位二进制格式的值,还有一些带符号的值: +Infinity, -Infinity,NaN

八进制字面量的第一个位必须是0,如果后面的数值超出了范围(0-7),那么该字面量的值会解析为十进制

var num1 = 011;
console.log(num1); //9
var num2 = 018;
console.log(num2); //18

十六进制字面量前两位必须是0x

var num1 = 0x11;
console.log(num1); //17
var num2 = 0x18;
console.log(num2); //24

在进行算术运算的时候,所有八进制数和十六进制数都将转换为10进制数进行计算

浮点数值

var num1 = 1.0; // 会被转为 num1 = 1
var num2 = 0.00000001; // 会被转化为 1e-8,小数点后面带有6个或以上的零都会被转换为科学计数法

尽量避免测试表达式和浮点数值的相等性(浮点数的最高精度是17位小数)

console.log(0.1 + 0.2 === 0.3); //false

数值范围

Number.NEGATIVE_INFINITY < Number.MIN_VALUE < Number.MAX_VALUE < Number.POSITIVE_INFINITY

NaN

它有两个很特别的地方:

console.log(NaN == NaN); //false, NaN并不等于它自身
console.log(NaN + 1); //NaNNaN参与运算时总会返回NaN

数值转换

把非数值转换为数值的三个函数:Number()、parsetInt()、parsetFloat()

Number()
//对于Boolean类型的值, true转换为1,false转换为0
console.log(Number(true));
console.log(Number(false));

//对于Number类型的值,会按照标准的数值表示类型输出,超出边界的值输出对应的边界值,非十进制会输出十进制值
console.log(Number(.1)); // 0.1
console.log(Number(1.00)); // 1
console.log(Number(.0000001)); // 1e-7
console.log(Number(0x23)); // 35
console.log(Number(011)); // 9
console.log(Number(NaN)); // NaN

//对于Null类型的值转换为0
console.log(Number(null));

//对于Undefined类型的值转换为NaN
console.log(Number(undefined));

//对于字符串而言,就相当复杂了
//当字符串里只包含数字的时候(包括小数点),和传入Number类型的表现一样,除了前导0(字符串的前导0会舍弃,而Number类型的前导0会按照八进制去转换为十进制)
console.log(Number(".1")); // 0.1
console.log(Number("1.00")); // 1
console.log(Number(".0000001")); // 1e-7
console.log(Number("011")); // 11

//如果十六进制的字符串前面有正负号,会转换为NaN,没有正负号会转换为标准的十进制表示形式
//不会识别"011"类型的八进制字符串,识别"0o11"表示的八进制字符串
console.log(Number("0x11")); // 17
console.log(Number("+0x11")); // NaN
console.log(Number("-0x11")); // NaN
console.log(Number("0o11")); // 9
console.log(Number("+0o11")); // NaN
console.log(Number("-0o11")); // NaN

//原文中有这样两句

如果字符串是空的(不包含任何字符),将其转换为0

console.log(Number("")); // 0
console.log(Number("   ")); // 空格字符也转换为了0
console.log("   " == ""); // false 而空字符串和空格字符串是不等的, 不知道空格算不算字符,按照他这里的意思是不算字符的

如果字符串中包含除上述格式之外的字符,则将其转换为NaN

//这里的\t \r \n均转换为了0而不是NaN,还有如果但输入 “\” 字符会有语法错误
console.log(Number("\t")); // 0
console.log(Number("\r")); // 0
console.log(Number("\n")); // 0
//如果传入的是对象,则调用对象的valueOf()方法,然后按照上述方法转换,如果返回值是NaN,则调用对象的toString()方法,然后再按照上述方法转换
console.log(Number(new Boolean("test"))); // 1 
console.log(Number(new String("test"))); // NaN
parseInt()

它的转换方式是:找到第一个非空格字符,如果不是正负号直接返回NaN,如果是数字字符就接着往后解析,直到遇到非数字字符(包括小数点)停止解析丢弃后面的字符,返回解析的数值

console.log(parseInt("10a")); //10
console.log(parseInt("a11")); //NaN

如果字符串是有效的十六进制数值字符串,就挨个解析,直到遇到不合法的十六进制单元(包括小数点)停止解析丢弃后面的字符,返回解析的数值(EMCA5不识别八进制数值的字符串)

console.log(parseInt("-0x66")); //-102
console.log(parseInt("0x66a")); //1642
console.log(parseInt("0x66arr")); //1642
console.log(parseInt("066a")); // 66

对于类似有效进制数值的字符串,parseInt()函数提供了第二个参数来指定进制数,书中给的建议是始终将10作为第二个参数

console.log(parseInt("066a")); // 66
console.log(parseInt("066a", 8)); // 54
parseFloat()

parseFloat()方法的使用和parseInt()方法类似,区别是parseFloat()函数可以识别小数点,但是不能识别类似进制数形式的字符串,也没有第二个参数,它只解析十进制值

console.log(parseFloat("-0x66")); // -0
console.log(parseFloat("0x66a")); // 0
console.log(parseFloat("2.3aa")); // 2.3
console.log(parseFloat("066")); // 66
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值