此系列体验视频教程
点击观看:哔哩哔哩
数值
整数与浮点数
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()
用于将字符串转为整数。
基本转换:
- 自动去掉头部空格,只取整数部分
parseInt(' 66') // 66
- 不是字符串,则会先转为字符串再转换。
parseInt(6.23) // 6
// 等同于
parseInt('6.23') // 6
- 一个个字符依次转换,遇到不能转为数字的字符,停止,返回已经转好的部分。
parseInt('9a') // 9
parseInt('126**') // 126
parseInt('12.56') // 12
parseInt('16e2') // 16
parseInt('36px') // 36
parseInt('+9') // 9
- 第一个字符都不能转化为数字(后面跟着数字的正负号除外)会返回NaN
parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN 特别注意
parseInt('+') // NaN
parseInt('+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
- 如果字符串以0开头,将其按照10进制解析。
parseInt('01000') // 1000
结论:parseInt的返回值只有两种可能,要么是一个十进制整数,要么是NaN。
按相应进制转换
- 可以接受第二个“进制”参数,按“进制”参数看待第一个参数,并返回第一个参数对应的十进制数。默认为十进制。
// 等同于
parseInt('1000') // 1000
// 等同于
parseInt('1000', 10) // 1000
parseInt('1000', 2) // 8
parseInt('1000', 8) // 512
parseInt('1000', 16) // 4096
- 第二个“进制”参数只能在2到36之间,超出这个范围,则返回
NaN。
parseInt('10', 37) // NaN
parseInt('10', 1) // NaN
- 如果第二个参数是
0、undefined和null,则直接忽略。
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)); // 报错 没有机会转换成字符串就报错了