一、数值与Number
JavaScript中对所有的数字只有一种类型,它把所有的数字都作为浮点数,JS中的数字是双精度值(64位)。
- 整数字面量
- 除了十进制以外,JavaScript还能识别十六进制(0x或0X为前缀)、二进制(0b或0B为前缀)和八进制(0o或0O为前缀)。
- 但是在ES6的严格模式下,就禁止使用八进制了。
{
let num = 100; // 十进制整数
let num2 = 0b1001; // 二进制数等于十进制 9
let num3 = 0xff; // 十六进制数等于十进制 255
}
- 浮点数字面量
- 实数写法:由整数部分、小数点和小数部分组成。如3.14
- 指数记数发:在实数部分后面跟e或E,再跟正负号,再跟一个整型的指数。如5e2就是500,0.5e-2就是0.005
在字面量上调用方法
{
123..toString();
123 .toString();
123.0.toString();
(123).toString();
}
对于数字字面量,用来访问一个属性的点必须要和小数点的点区分开来,以上是在数字字面量123上调用toString的几种方法。
1.转换成数字
其他值转为数字的转换如下表所示:
值 | 结 果 |
---|---|
undefined | NaN |
null | 0 |
布尔值 | false转为0,true转为1 |
数字 | 保持不变(没什么好转换的) |
字符串 | 解析字符串中的数字(忽略开头和结尾的空格)空字符转为0 |
对象 | 对象会先转换为原始值,然后再转换为数字 |
JavaScript提供了三个函数可将非数值转换为数值。Number()、parseInt()、parseFloat()。
一些小例子
{
Number(''); // 0
Number(false); // 0
Number(null); // 0
Number(undefined); // NaN
Number('011'); // 11
Number('1.1'); // 1.1
Number('0xf'); // 15
// parseInt()
parseInt(22.5); // 22
parseInt('0xA'); // 10
parseInt('A', 16); // 第二个参数为 16进制转为 10
parseFloat('3.14159e3'); // 3141.59
}
2.数值的算术运算
- 运算符:+、-、*、/、%、**(指数运算符,ES6新增)
- 溢出(overflow):当数值运算结果超过了JavaScript能表示的数值上限时发生,结果为Infinity,若超过了负数范围则为-Infinity。
- 下溢(underflow):当运算结果无限接近于0,并比JavaScript能表示的最小值还小时发生,JS会返回0,若为负数发生下溢,则返回-0。
3.特殊的数字值
JavaScript中有一些特殊的数字值:
- 两个错误值:NaN和Infinity
- 两个零值:+0和-0
NaN(not a number)
{
// NaN居然是一个数字
console.log(typeof NaN); // 输出 number
// NaN是唯一一个和自身不相等的值
console.log(NaN === NaN); // false
// 检查一个值是否是NaN,必须使用全局函数isNaN();
console.log(isNaN(NaN)); // 输出 true
console.log(isNaN(123)); // 输出 false
}
Infinity:一个大到无法表示的数字,或者除以了0
{
console.log(Math.pow(2,1024)); // 数学对象的方法表示2的1024次方,结果为Infinity
console.log(3/0); // 输出Infinity
}
4.Number函数
Number函数可以用两种方式调用
- Number(value)作为一个常规函数,将value转换为一个原始数字。
- new Number(num)作为构造函数,创建了一个Number的实例,即一个包装了num的对象
{
console.log(typeof Number('123')); // 输出number
console.log(typeof new Number(3)); // 输出object
}
4.1 Number的构造器属性
Number对象有如下属性:
{
1.Number.MAX_VALUE 表示可以表示的最大正数
console.log(Number.MAX_VALUE) // 1.7976931348623157e+308
2.Number.MIN_VALUE 表示可以表示的最小正数值
console.log(Number.MIN_VALUE); // 5e-324
3.Number.NaN 和全局的NaN是相同的值
4.Number.NEGATIVE_INFINITY 和-infinity相同
console.log(Number.NEGATIVE_INFINITY === -Infinity); // true
5.Number.POSITIVE_INFINITY 和Infinity相同
console.log(Number.POSITIVE_INFINITY === Infinity); // true
}
4.2 Number的方法
原始值中数字的所有方法都存储在Number.prototype中,关于原型的学习整理在后续的笔记中,这里就直接简写方法。
常用的方法:
{
1.Number.toString(); 参数可以是2,10,16表示相对应的进制数
let num = new Number(100);
console.log(num.toString()); // 输出字符串的 100
2.Number.valueOf(); 返回数值对象的原始数值,也就是去包装过程
let num1 = new Number(100);
console.log(num1.valueOf()); // 输出数值的 100
3.Number.toFixed(n); 返回包含n位小数位数的数值字符串
console.log(10.005.toFixed(2)); // 输出字符串的 10.01 会四舍五入
4.Number.toExponential(n); 返回科学计数法表示的数值字符串,n表示结果中的小数位数
console.log(10.1234.toExponential(4)); // 输出 1.0123e+1
}
用于数字的方法:
{
1.Number.isFinite(); 用于检查一个数值是否是有限的
console.log(Number.isFinite(10)); // true
console.log(Number.isFinite(NaN)); // false
console.log(Number.isFinite('foo')); // false
如果参数类型不是数值,那么一律都会返回false
2.Number.isNaN(); 用于检查一个数值是否为NaN
console.log(Number.isNaN(10)); // false
console.log(Number.isNaN(true)); // false
如果参数类型不是NaN,那么一律返回false
3.Number.parseInt()和Number.parseFloat()与全局的这两个方法是一样的,
只是ES6将全局的 parseInt()和 parseFloat()移植到了Number对象中。
console.log(Number.parseInt === parseInt); // true
console.log(Number.parseFloat === parseFloat); // true
4.Number.isInteger() 用于判断一个数值是否为整数
console.log(Number.isInteger(12.1)); // false
console.log(Number.isInteger('123')); // false
如果参数不是数值以及不是整数,返回false
}
5.Math对象
属性 | 功能 |
---|---|
Math.E | 自然对数e的值 |
Math.PI | π的值 |
Math.max() | 返回给定参数中的最大值 |
Math.min() | 返回给定参数中的最小值 |
Math.cell() | 向上舍入最接近的整数 |
Math.floor() | 向下舍入最接近的整数 |
Math.round | 执行四舍五入 |
Math.random() | 返回一个0-1之间的随机数,其中包含0但不包含1 |
其他更多的方法可以查阅W3CSchool的官方文档JavaScript的Math对象
二、布尔Boolean
JavaScript中原始的布尔类型包括两个值,true和false
转换成布尔值
值 | 转换成的布尔值 |
---|---|
undefined | false |
null | false |
布尔值 | 与输入相同(没必要转换) |
数字 | 0,NaN转换为false,其他数字转换成true |
字符串 | 空字符串转换成false,其他字符串转换成true |
对象 | 总是为true |
利用隐式转换
{
let x = 100;
let y = null;
let z;
if (x) {
console.log(x);
}
if (y != null) {
console.log(y);
}
if (z) {
console.log(z);
}
}
上面的代码会输出100,因为if的判断条件会隐式的转换表达式的值,所以当表达式里的值为true时才会执行条件里的语句,因此输出了100.
逻辑运算符的妙用
短路运算:如果第一个表达式已经决定了结果,那么就不再求第二个表达式的值,这就是短路运算。
举个例子:
{
console.log(true || 'hello'); // 输出 true
console.log(false || 'world'); // 输出 world
}
通过上面这个特性可以用在一些场景中,比如函数参数的默认值等等。
{
function test(text){
text = text || 'hello';
return console.log(text);
}
test(); // 输出 hello
}
因为函数没有传入参数,因此函数体内有短路运算设置了默认值,因此输出了hello。