《ES6标准入门(第3版)》学习笔记18:chapter_6 数值的扩展(三)

这是该系列的第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中运行的结果不一样!!

让学习“上瘾”,成为更好的自己!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值