每天3小时学前端之JS-第3天-数值类型

598 阅读5分钟

此系列体验视频教程

点击观看:哔哩哔哩

数值

整数与浮点数

js语言的底层根本没有整数,所有数字都是小数(浮点数) 1与1.0是相同的,是同一个数。 1 === 1.0 // true

由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。

0.1 + 0.2 === 0.3
// false

0.3 / 0.1
// 2.9999999999999996

(0.3 - 0.2) === (0.2 - 0.1)
// false

进制

js对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制。

  • 十进制:没有前导0的数值。
  • 八进制:有前缀0o或0O的数值
  • 十六进制:有前缀0x或0X的数值。
  • 二进制:有前缀0b或0B的数值。

默认情况下,js内部会自动将八进制、十六进制、二进制转为十进制

0xac // 172
0o176 // 126
0b111111 // 63

如果八进制、十六进制、二进制的数值里面,出现不属于该进制的数字,就会报错。

0x1h // 报错
0o79 // 报错
0b16 // 报错

特殊数值(了解)

正零和负零

任何一个数都有一个对应的负值,就连0也不例外。

几乎所有场合,正零和负零都会被当作正常的0

+0 // 0
-0 // 0
-0 === +0 // true
0 === -0 // true
0 === +0 // true

唯一有区别的场合是,+0或-0当作分母,返回的值是不相等的。 (1 / +0) === (1 / -0) // false

之所以出现这样结果,是因为除以正零得到+Infinity,除以负零得到-Infinity,这两者是不相等的。

NaN(了解)

NaN是js的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。

6 - 'a' // NaN
0 / 0 // NaN

NaN的数据类型依然是number

typeof NaN // 'number'

NaN不等于任何值,包括它本身。

NaN === NaN // false

NaN与任何数(包括它自己)的运算,得到的都是NaN。

NaN + 66 // NaN
NaN - 66 // NaN
NaN * 66 // NaN
NaN / 66 // NaN

Infinity(了解)

Infinity表示“无穷”。

1 / 0 // Infinity

Infinity有正负之分,Infinity表示正的无穷,-Infinity表示负的无穷。

Infinity === -Infinity // false

1 / -0 // -Infinity
-1 / -0 // Infinity

与数值相关的全局方法

parseInt()

用于将字符串转为整数。

基本转换

  1. 自动去掉头部空格,只取整数部分
parseInt('   66') // 66
  1. 不是字符串,则会先转为字符串再转换。
parseInt(6.23) // 6
// 等同于
parseInt('6.23') // 6
  1. 一个个字符依次转换,遇到不能转为数字的字符,停止,返回已经转好的部分。
parseInt('9a') // 9
parseInt('126**') // 126
parseInt('12.56') // 12
parseInt('16e2') // 16
parseInt('36px') // 36
parseInt('+9') // 9
  1. 第一个字符都不能转化为数字(后面跟着数字的正负号除外)会返回NaN
parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN 特别注意
parseInt('+') // NaN
parseInt('+1') // 1
  1. 如果字符串以0x或0X开头,parseInt会将其按照十六进制数解析。
parseInt('01000') // 1000
parseInt('0x10') // 16
parseInt('0X10') // 16

// 注意:二进制和八进制不会按照相应进制解析
parseInt('0b11') // 0
parseInt('0B11') // 0
parseInt('0o11') // 0
parseInt('0O11') // 0
  1. 如果字符串以0开头,将其按照10进制解析。
parseInt('01000') // 1000

结论:parseInt的返回值只有两种可能,要么是一个十进制整数,要么是NaN。

按相应进制转换

  1. 可以接受第二个“进制”参数,按“进制”参数看待第一个参数,并返回第一个参数对应的十进制数。默认为十进制。
// 等同于
parseInt('1000')  // 1000
// 等同于
parseInt('1000', 10) // 1000

parseInt('1000', 2) // 8
parseInt('1000', 8) // 512
parseInt('1000', 16) // 4096

  1. 第二个“进制”参数只能在2到36之间,超出这个范围,则返回NaN
parseInt('10', 37) // NaN
parseInt('10', 1) // NaN
  1. 如果第二个参数是0undefinednull,则直接忽略。
parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10

parseFloat()

用于将一个字符串转为浮点数(小数)。 也是一个一个的依次转换,直到不能转换为止(包括小数点后面的),返回转换好的部分,如果第一个字符都不能转换,则返回NaN

parseFloat('123.65a') // 123.65
parseFloat([]) // NaN
parseFloat('FF2') // NaN
parseFloat('') // NaN 特别注意

练习

进制转换

console.log(0o3a); // 报错
console.log(0b1010); // 10
console.log(0x3c9); // 969
console.log(02b1); // 报错
console.log(0xb3h); // 报错
console.log(00190); 190
console.log(0b120); // 报错

数值相关全局方法的应用

console.log(parseInt('0o169')); // 0
console.log(parseInt('0b161')); // 0
// console.log(parseInt(0o169)); // 报错
console.log(parseInt(0o166)); // 118
// console.log(parseInt(0b161)); // 报错
console.log(parseInt(0b101)); // 5
console.log(parseInt('1.c2')); // 1
// console.log(parseInt(1.c2)); // 报错 没有机会转换成字符串就报错了
console.log(parseInt(3.65)); // 3
console.log(parseInt('3.65')); // 3
console.log(parseInt('3.c5')); // 3
console.log(parseInt(-9.6)); // -9
// console.log(parseInt(-9.a)); // 报错 没有机会转换成字符串就报错了
console.log(parseInt(.6)); // 0
// 等同于
console.log(parseInt(0.6)); // 0
console.log(parseInt('.6')); // NaN
console.log(parseInt(0x13)); // 19
console.log(parseInt('0x13')); // 19
console.log(parseInt('0x1a', 16)); // 26 传递了第二个参数来指定当前字符串进制,可以加前缀也可以不加
console.log(parseInt('1a', 16)); // 26
console.log(parseInt('ah', 16)); // 10 按照相应进制解析,而且也是一个一个的解析
console.log(parseInt('ac', 16)); // 172
console.log(parseInt('ac')); // NaN
// console.log(parseFloat(3.65c)); // 报错 没有机会转换成字符串就报错了
console.log(parseFloat('3.65c')); // 3.65
console.log(parseFloat('.65c')); // 0.65
// console.log(parseFloat(.65c)); // 报错 没有机会转换成字符串就报错了