这是该系列的第18篇笔记!
7,Math对象的扩展
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Math对象的扩展</title>
</head>
<body>
<script>
// ES6在Math对象上新增17个与数学相关的方法,且都是静态方法,只能在Math对象上调用
// (1) Math.trunc() --> 用于去除一个数的小数部分,返回整数部分
// console.log(Math.trunc(4.22)); // 4
// console.log(Math.trunc(-343.92)); // -343
// console.log(Math.trunc(-0.2121)); // -0
// 对于非数值,Math.trunc()内部使用了Number方法将其先转为数值
// console.log(Math.trunc('1232.323'));
// 对于空值和无法截取整数的值,返回NaN
// console.log(Math.trunc( ));
// console.log(Math.trunc('foo'));
// console.log(Math.trunc(NaN));
// 方法的实现(对于没有部署Math.trunc()的环境)
Math.trunc = Math.trunc || function (x) {
return x < 0 ? Math.ceil(x) : Math.floor(x);
}
// (2) Math.sign() --> 用来判断一个数到底是正数、负数,还是0,对于非数值,会先将其转换为数值
// 返回值有5种情况:
// 参数是正数 --> +1
// 参数是复数 --> -1
// 参数是0 --> 0
// 参数是-0 --> -0
// 其他值 --> NaN
// console.log(Math.sign(12));
// console.log(Math.sign(-12));
// console.log(Math.sign(0));
// console.log(Math.sign(-0));
// console.log(Math.sign(NaN));
// 方法的实现(对于没有部署Math.sign()的环境)
Math.sign = Math.sign || function (x) {
x = +x;
if (x === 0 || isNaN(x)) {
return x;
}
return x > 0 ? 1 : -1;
}
// (3) Math.cbrt() --> 计算一个数的立方根,对于非数值,会先将其转换为数值
// console.log(Math.cbrt(2));
// console.log(Math.cbrt(-3));
// console.log(Math.cbrt('5'));
// console.log(Math.cbrt('hello')); // NaN
// 方法的实现(对于没有部署Math.cbrt()的环境)
Math.cbrt = Math.cbrt || function (x) {
var y = Math.pow(Math.abs(x), 1/3);
return x < 0 ? -y : y;
};
// (4) Math.clz32() --> 返回一个数的32位无符号整数形式有多少个前导0
// JavaScript的整数使用32位二进制形式表示
// console.log(Math.clz32(0)); // 32 --> 0的二进制形式全为0,所以有32个前导0
// console.log(Math.clz32(1)); // 31 --> 0的二进制形式全为0b1,只占1位,所以有31个前导0
// console.log(Math.clz32(1000)); // 22
// console.log(Math.clz32(0));
// 左移运算符与Math.clz32方法直接相关
// console.log(Math.clz32(1 << 1)); // 30
// console.log(Math.clz32(1000 >> 2)); // 24
// 对于小数,Math.clz32只考虑整数部分
// console.log(Math.clz32(1.212)); // 31
// console.log(Math.clz32(1.23)); // 31
// console.log(Math.clz32(1000.76)); // 22
// 对于空值或其他值,Math.clz32会先将其转换为数值
// console.log(Math.clz32(true)); //31
// 以下结果都为32
// console.log(Math.clz32(NaN));
// console.log(Math.clz32(Infinity));
// console.log(Math.clz32(null));
// console.log(Math.clz32('foo'));
// console.log(Math.clz32([]));
// (5) Math.imul() --> 返回两个数以32带符号整数形式相乘的结果,返回的也是一个32位带符号的整数
// console.log(Math.imul(2, 4)); // 8
// console.log(Math.imul(-1, 8)); // 8
// console.log(Math.imul(-2, -2)); // 4
// 大多数情况下,Math.imul(a, b)与a * b的结果是相同的,该方法等同于(a * b) | 0;
// 区别 --> “按位或”
// console.log(0x7fffffff * 0x7fffffff | 0) ; // 0 --> 错误
// console.log(Math.imul(0x7fffffff, 0x7fffffff)); // 1 --> 正确
// (6) Math.fround() --> 返回一个数的单精度浮点数形式
// 对于整数,Math.fround()返回的结果跟原来的数值不会与不同
// console.log(Math.fround(121));
// 对于那些无法用64个二进制精确表示的小数,Math.fround()方法会返回最接近这个小数的单精度浮点数
// console.log(Math.fround(1.337)); // 1.3370000123977661
// console.log(Math.fround(1.5)); // 1.5
// console.log(Math.fround(NaN));
// 方法的实现(对于没有部署Math.fround()的环境)
Math.cbrt = Math.fround || function (x) {
return new Float32Array([x])[0];
};
// (7) Math.hypot() --> 返回所有参数的平方和的平方根
// 对于非数值,会先将其转换为数值,只要有一个参数无法转为数值,就会返回NaN
// console.log(Math.hypot(3, 4)); // 5
// console.log(Math.hypot('6', 8)); // 10
// console.log(Math.hypot(3, 4, 5)); // 7.0710678118654755
// console.log(Math.hypot(-3)); // 3
// 以下结果返回NaN
// console.log(Math.hypot(3, 4, 'foo'));
// console.log(Math.hypot('true1', 8));
// (8) 对数方法
// a, Math.expm1() --> 返回Math.exp(x) - 1
console.log(Math.expm1(0)); // 0
console.log(Math.expm1(1)); // 1.718281828459045
// b, Math.log1p() --> 返回ln(1+x),即Math.log(1+x),如果x小于-1,则返回NaN
console.log(Math.log1p(0)); // 0
console.log(Math.log1p(1)); // 0.6931471805599453
console.log(Math.log1p(-2)); // NaN
// c, Math.log10() --> 返回以10为底的x的对数,如果x小于0,则返回NaN
console.log(Math.log10(100)); // 2
console.log(Math.log1p(-21)); // NaN
// d, Math.log2() --> 返回以2为底的x的对数,如果x小于0,则返回NaN
console.log(Math.log2(8)); // 3
console.log(Math.log1p(-2)); // NsN
// 【以下部分涉及时再来看!!!】
// (9) 双曲函数方法
// a, Math.sinh(x)
console.log(Math.sinh(Math.PI / 2));
console.log(Math.sin(Math.PI / 2));
// b, Math.cosh(x)
// c, Math.tanh(x)
// d, Math.asinh(x)
// e, Math.acosh(x)
// f, Math.atanh(x)
</script>
</body>
</html>
8,指数运算符
// 指数运算符:**
console.log(2**3);
console.log(Math.pow(2, 3));
// 可以与等号结合,形成一个新的赋值运算符
let a = 2;
a **= 4;
console.log(a);
// 在V8引擎中,指数运算符与Math.pow()的实现不相同
console.log(Math.pow(99, 99));
console.log(99 ** 99);
console.log((99 ** 99) === Math.pow(99 ,99)) // true --> 在Chrome和Firefox中运行的结果不一样!!
让学习“上瘾”,成为更好的自己!!!