数值新增特性
新增的二进制和八进制表示方式
js
// 十六进制形式表示数字
0x105;
// 八进制形式表示数字
0o105;
// 二进制形式表示数字
0b1010;
number实例的方法和属性
js
toFixed(num) 参数是数字num,作用是将数字格式化为保留num位小数的字符串(四舍五入)
Number 构造函数本身新增的方法和属性
ES5:
js
Number.MAX_VALUE; 最大的数
Number.MIN_VALUE; 最小的正数
ES6+ (新)
整数在内存中存储原理和浮点的存储原理不一致,浮点的存储方式可以表示更大的数字,但是精度不够。
整数的存储方式就是按照整数,精度准确,也叫做安全整数。
js
Number.MAX_SAFE_INTEGER 读取最大的安全整数
Number.MIN_SAFE_INTEGER 读取最小的安全整数
Number.EPSILION 两个数字间最小差值,就是JS的数字精度
Number.isNaN() 同全局对象的 isNaN()
Number.isFinite() 同全局对象的 isFinite()
Number.parseInt() 同全局对象的 parseInt()
Number.parsetFloat() 同全局对象的 parsetFloat()
Number.isInteger() 判断参数是否是整数,返回布尔值
Number.isSafeInteger() 判断参数是否是安全整数,返回布尔值
案例
js
Number.isInteger(25) // true
Number.isInteger(25.1) // false
Number.isInteger(25.0) // true
// 如果参数不是数值,Number.isInteger返回false。
Number.isInteger() // false
Number.isInteger(null) // false
Number.isInteger('15') // false
Number.isInteger(true) // false
// 这个小数的精度达到了小数点后16个十进制位,转成二进制位超过了53个二进制位,导致最后的那个2被丢弃了。
Number.isInteger(3.0000000000000002) // true
// 如果一个数值的绝对值小于Number.MIN_VALUE(5E-324),即小于 JavaScript 能够分辨的最小值,会被自动转为 0。
Number.isInteger(5E-324) // false
Number.isInteger(5E-325) // true
Math 对象新增方法
Math的构造函数是Object,是Object的实例,可以直接使用。
ES5(旧):
js
Math.PI 圆周率
Math.abs() 返回绝对值
Math.sqrt() 返回平方根
Math.pow() 返回次方数,两个参数
Math.floor() 返回整数,向下取整
Math,ceil() 返回整数,向上取整
Math.round() 返回整数,四舍五入
Math.random() 返回一个随机数,范围是0到1,0可能会被取到,1不可能。
Math.max() 返回参数中最大的,参数数量可以是任意个
Math.min() 返回参数中最小的,参数数量可以是任意个
ES6+ (新):
js
Math.trunc() 截取数字中的整数部分
Mthn.sign() 参数是整数返回1,参数是负数返回-1,参数是0返回0
Mthn.sign() 判断一个数到底是正数、负数、还是零,其他返回 NaN。
Math.cbrt() 返回参数的立方根
Math.hypot() 返回所有参数的平方和的平方根
js
console.log(Math.trunc(12.23));
console.log('');
console.log(Math.sign(12.45));
console.log(Math.sign(-90));
console.log(Math.sign(0));
console.log('');
console.log(Math.cbrt(8));
console.log(Math.cbrt(10));
console.log('');
console.log(Math.hypot(3, 4));
console.log(Math.hypot(3, 4, 5));
新增原始数据类型 bigint (ES2020)
JavaScript 所有数字都保存成 64 位浮点数,这给数值的表示带来了两大限制。一是数值的精度只能到 53 个二进制位(相当于 16 个十进制位),大于这个范围的整数,JavaScript 是无法精确表示的,这使得 JavaScript 不适合进行科学和金融方面的精确计算。二是大于或等于2的1024次方的数值,JavaScript 无法表示,会返回Infinity
。
ES2019 引入了一种新的数据类型 BigInt(大整数),来解决这个问题,这是 ECMAScript 的第八种数据类型。BigInt 只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。
为了与 Number 类型区别,BigInt 类型的数据必须添加后缀n
。
bigint 数据类型:
js
1. bigint 是一种数据类型,属于原始类型。
2. 使用 typeof 判断,返回 bigint。
bigint 类型的数据的表示方式:
js
// 十进制表示
45n;
// 前面可以加 -,不允许加 +
-1231231231239182923n;
// 二进制、八进制、十六进制表示
0b101n;
0o75n;
0xab1n;
bigint 类型的数据的特点:
js
1. bigint 类型的数据不能与其他类型进行数学运算符
2. bigint 类型的数据和 number 类型的数据可以互相转换
3. bitint 只能表示整数
BigInt 与普通整数是两种值,它们之间并不相等。
javascript
42n === 42 // false
bigint 类型的数据的作用:
js
bigint 可以表示的数字范围没有限制,而且计算精度是精确的!
BigInt 可以使用负号(-
),但是不能使用正号(+
)。
javascript
-42n // 正确
+42n // 报错
symbol 类型
有对象特征的原始类型数据。只能调用不能New。
js
1. symbol 使用原始类型,使用 typeof 判断返回 symbol;
2. 使用 Symbol() 函数创建 symbol 类型的数据,Symbol() 只能调用不能实例化new Symbol;
3. 每使用 Symbol() 创建一个数据,都是独一无二(具有对象特性);
3. symbol 类型的数据可以用作对象的属性名 (属性名可以是字符串或者symbol数据);
在对象中,使用中括号[] 当作表达式
案例
js
// 创建 symbol 类型的数据
let s1 = Symbol();
let s2 = Symbol();
console.log(s1); //Symbol()
console.log(typeof s1); //symbol
console.log(s2); //Symbol()
console.log(s1 === s2); //false
console.log('');
let s3 = Symbol('xiaole'); // 这里的“xiaole”仅仅作为一个标记,供开发者使用。
let s4 = Symbol('xiaole');
console.log(s3); //Symbol(xiaole)
console.log(s4); //Symbol(xiaole)
console.log(s3 === s4); //false
console.log('');
// 可以作为对象的属性名
const m = 'address';
const user = {
[m]: '北京',
[s1]: '上海',
[s3]: '广州',
[Symbol()]: '深圳',
}
console.log(user); //Object对象
console.log(user[s1]); //上海
console.log(user[s3]); //广州
console.log(user[Symbol()]);//undefined?
//new Symbol(); //报错 Symbol is not a constructor
const msg = new String('Hello World');
console.log(msg); //String类型对象 {'Hello World'}
数字间隔符(ES2021)
允许数值直接量中间包含不连续_
,以提高可读性。分隔符不能在尾部和头部,只能在数字之间,只允许一个下划线作为数字分隔符,不可连续。分隔符不影响数值的类型转换值,也无法在字符串转数值时被识别。
js
123_0000;
12_0000_0000;
12_434_900;