美文网首页
我所了解的es6(02)

我所了解的es6(02)

作者: KlivitamJ | 来源:发表于2018-06-08 09:42 被阅读30次

话说最近大事儿有点勤啊。昨天下班的时候还聊到,google研制出了一款可以写前端代码。我们一群程序员底层人员还在担忧未来面临失业的问题,我们甚至都聊到了如果人工智能取代我们工作,那么我们将会面临被机器人统治的危险境地(科幻电影看多了)。晚上回到宿舍的时候翻了翻微信公众号上面的新闻又发现nodejs的发明家说了一句:
Rather I will complain about all the warts in Node. Bugs are never so obvious as when you're the one responsible for them. At times Node is like nails on chalkboard to me. It could have been so much nicer.
打开github本来想瞧一瞧这新语言的魅力的时候,却又发现:

微软75亿美元收购github
你无法去想象未来将会成什么样子,这也是你不能理解全球最大不开源的厂商会去收购全球最大开源厂商、你也无法去想象几个月以前被吹到天上去的nodejs会被面临抛弃的尴尬境地。也许未来人工智能会取代像我们这样低级程序员,即使是一天更换一种语言,但是只要我们能保持初心,一定能方得始终。但...

一、数值的扩展

1. 进制表示法

es6其实提供了新的八进制的写法。众所周知,在es5的严格模式下面,八进制就不再允许使用前缀0表示。但是es6中定义了0b0o来分别定义二进制数和八进制数。

{
    // es5中非严格模式下
    (function(){
        // "use strict"
        console.log(0o11 === 011) // true
    })()

    es5中严格模式下
    (function(){
        "use strict"
        console.log(0o11 === 011) // SyntaxError: Octal literals are not allowed in strict mode
    })()

    /**
     * es6中提供了新的写法
     * 0b代表二进制
     * 0o代表八进制
     **/
    console.log(0b111110111 === 503) // true
    console.log(0o767 === 503) // true

    // Number 方法可以把二进制和八进制转化成10进制数据
    console.log(Number("0b111110111")) // 503
    console.log(Number("0o767")) // 503

}

2.Number

关于Number自己做的一个总结

首先来谈一谈isFinite这个函数,是用来判断是否是有限的

{ //我这里可以补充一下,也是我发现的 1/0会得到infinty
  console.log("Finite",Number.isFinite(0)) // true
  console.log(1/0) // Infinity
  console.log("Finite",Number.isFinite(1/0)) // false
  console.log("Finite",Number.isFinite("1/0")) // false
  console.log("Finite",Number.isFinite("klivitam")) // false
  console.log("Finite",Number.isFinite(NaN)) // false
}

然后谈一谈isNaN,这个主要用来判断是否是NaN,当然这里必须得注意的是

    console.log("NaN",Number.isNaN(0)) // false
    console.log("NaN",Number.isNaN(NaN)) // true
    console.log("NaN",Number.isNaN("NaN")) // false
    console.log("NaN",Number.isNaN("klivitam")) // false
    console.log("NaN",Number.isNaN('true' / 0)) // true
    console.log("NaN",Number.isNaN(9/NaN)) // true
    console.log("NaN",Number.isNaN('true' / 'true')) // true

在es6中将原本es5中的全局函数parseInt、parseFloast放入Number中。并且在本方法中,会尝试将非数值类型转化成数值类型,如果遇到不能转化的情况就直接返回NaN类型

    //es5写法
    console.log("parseInt",parseInt("1.1")) // 1
    console.log("parseFloat",parseFloat("11.11#")) // 11.11
    //es6写法
    console.log("parseInt",Number.parseInt("1.1")) // 1
    console.log("parseInt",Number.parseInt("klivitam")) // NaN
    console.log("parseFloat",Number.parseFloat("11")) // 11
    console.log("parseFloat",Number.parseFloat("klivitam")) // NaN

isInteger方法比较简单,就是判断类型是否为int类型。但是这里有一点东西,在javascript中,整数和浮点数采用的是同样的储存方法,所以 25 和 25.0 被视为同一个值。并且存在这么一种情况那就是如果精度太小的情况下,会被默认看做0,会返回true

    console.log("Integer",Number.isInteger(25)) // true
    console.log("Integer",Number.isInteger(25.0)) // true
    console.log("Integer",Number.isInteger(25.00)) // true
    console.log("Integer",Number.isInteger(25.1)) // false
    console.log("Integer",Number.isInteger("25")) // false
    console.log("Integer",Number.isInteger(null)) // false
    console.log("Integer",Number.isInteger()) // false
    // 如果数值的精度超过53 个二进制位,第54位及后面的位就会被丢弃,这种情况下,Number.isInteger可能会误判。
    console.log("Integer",Number.isInteger(5E-324)) // false
    console.log("Integer",Number.isInteger(5E-325)) // true

es6中定义了三个常量:EPSILON、MAX_SAFE_INTEGER、MIN_SAFE_INTEGER。分别代表的是最小的常量值、最大的整数常量值、最小的整数常量值。并且es6还提供isSafeInteger方法来检测是否处于MIN_SAFE_INTEGER、MAX_SAFE_INTEGER区间内

    console.log("common",Number.EPSILON) // 2.220446049250313e-16
    console.log("common",Number.MAX_SAFE_INTEGER) // 9007199254740991 2^53-1
    console.log("common",Number.MIN_SAFE_INTEGER) // 9007199254740991 -2^53+1
    console.log("SafeInteger",Number.isSafeInteger(Number.MAX_SAFE_INTEGER+1)) // false
    console.log("SafeInteger",Number.isSafeInteger(Number.MIN_SAFE_INTEGER-1)) // false
    console.log("SafeInteger",Number.isSafeInteger(Number.MIN_SAFE_INTEGER)) // true
    console.log("SafeInteger",Number.isSafeInteger(Number.MIN_SAFE_INTEGER)) // true

三、Math

首先关于es5,我差不多整理了一下所有math方法的用处:


math方法

至于前面的那些方法,我就多做赘述了,大家差不多也能看懂,我就直接来讲es6中新增的方法:

3-1、trunc

该方法会只取整数部分,去掉小数部分。对于不是整数的数据,内部会先用Numer转成整数进行处理,如果强转整数失败则返回NaN。

{
    /* Math */
    // trunc:取整运算
    console.log("trunc",Math.trunc(4.2)) // 4
    console.log("trunc",Math.trunc(-4.2)) // -4
    console.log("trunc",Math.trunc(-0.234)) // 0
    //非整数,先转化为整数,再取整
    console.log("trunc",Math.trunc("-4.2")) // -4
    console.log("trunc",Math.trunc(true)) //1
    console.log("trunc",Math.trunc(false)) // 0
    console.log("trunc",Math.trunc(null)) // 0
    // 无法取整的,直接返回NaN
    console.log("trunc",Math.trunc(NaN));      // NaN
    console.log("trunc",Math.trunc('klivitam'));    // NaN

}

sign

该方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。对于整数返回+1、负数返回-1、0返回0、-0返回-0、其他返回NaN。

{
    // sign:判断正负
    console.log("sign",Math.sign(10)) // 1
    console.log("sign",Math.sign(-10)) // -1
    console.log("sign",Math.sign(0)) // 0
    console.log("sign",Math.sign(-0)) // 0
    console.log("sign",Math.sign(''))  // 0
    console.log("sign",Math.sign(true))  // 1
    console.log("sign",Math.sign(false))  // 0
    console.log("sign",Math.sign(null))  // 0
    console.log("sign",Math.sign('9'))  // 1
    console.log("sign",Math.sign('foo'))  // NaN
    console.log("sign",Math.sign())  // NaN
    console.log("sign",Math.sign(undefined))  // NaN
}

cbrt

该方法用来计算一个值的立方根

{
    // cbrt:计算一个值的立方根
    console.log("cbrt",Math.cbrt(8)) // 2
    console.log("cbrt",Math.cbrt(-1)) // -1
    console.log("cbrt",Math.cbrt("-27")) // -3
    console.log("cbrt",Math.cbrt("klivitam")) // NaN
    console.log("cbrt",Math.cbrt(NaN)) //  NaN
    console.log("cbrt",Math.cbrt(null)) // 0
    console.log("cbrt",Math.cbrt(undefined)) // NaN
    console.log("cbrt",Math.cbrt(Infinity)) // Infinity
}

clz32

JavaScript 的整数使用 32 位二进制形式表示,Math.clz32方法返回一个数的 32 位无符号整数形式有多少个前导 0。

{
    // clz32:JavaScript 的整数使用 32 位二进制形式表示
    console.log("clz32",Math.clz32(0)) // 32
    console.log("clz32",Math.clz32(1)) // 31
    console.log("clz32",Math.clz32(1000)) // 22
    console.log("clz32",Math.clz32(0b01000000000000000000000000000000)) // 1
    console.log("clz32",Math.clz32(0b00100000000000000000000000000000)) // 2
    console.log("clz32",Math.clz32(2)) // 30
    console.log("clz32",Math.clz32(2 << 1)) // 29
    console.log("clz32",Math.clz32(2 << 2)) // 28
    // 小数只考虑整数部分
    console.log("clz32",Math.clz32(5.6)) // 29
    console.log("clz32",Math.clz32(4.2)) // 29
    // 非整数先转化成整数,在...
    console.log("clz32",Math.clz32()) // 32
    console.log("clz32",Math.clz32(NaN)) // 32
    console.log("clz32",Math.clz32(Infinity)) // 32
    console.log("clz32",Math.clz32(null)) // 32
    console.log("clz32",Math.clz32('foo')) // 32
    console.log("clz32",Math.clz32([])) // 32
    console.log("clz32",Math.clz32({})) // 32
    console.log("clz32",Math.clz32(true)) // 31
}

Math.fround()

该方法返回一个数的32位单精度浮点数形式。注意这个的返回-2^24 至 2^24 之间的整数。它的主要作用是将64位双精度转化成单精度浮点数(虽然没用过)。

Math.fround(0)   // 0
Math.fround(1)   // 1
Math.fround(2 ** 24 - 1)   // 16777215
Math.fround(2 ** 24)       // 16777216
Math.fround(2 ** 24 + 1)   // 16777216

Math.hypot

求所有参数的平方和的平方根。如果其中有一个值不能转化成Number就会返回NaN。

Math.hypot(3, 4);        // 5
Math.hypot(3, 4, 5);     // 7.0710678118654755
Math.hypot();            // 0
Math.hypot(NaN);         // NaN
Math.hypot(3, 4, 'foo'); // NaN
Math.hypot(3, 4, '5');   // 7.0710678118654755
Math.hypot(-3);          // 3

对数运算符

  • Math.expm1:意思就是e^x-1
  • Math.log1p:意思就是log(x+1)
  • Math.log10:返回以 10 为底的x的对数。如果x小于 0,则返回 NaN。
  • Math.log2:返回以 2 为底的x的对数。如果x小于 0,则返回 NaN。

双曲函数方法

  • Math.sinh(x) 返回x的双曲正弦(hyperbolic sine)
  • Math.cosh(x) 返回x的双曲余弦(hyperbolic cosine)
  • Math.tanh(x) 返回x的双曲正切(hyperbolic tangent)
  • Math.asinh(x) 返回x的反双曲正弦(inverse hyperbolic sine)
  • Math.acosh(x) 返回x的反双曲余弦(inverse hyperbolic cosine)
  • Math.atanh(x) 返回x的反双曲正切(inverse hyperbolic tangent)

指数运算符

es6中新增加了**运算符,和es5的pow运算符作用差不太多。

{
    // ** 指数运算符
    console.log("指数",2**3) //8
    console.log("指数",Math.pow(2,3)) // 8
    // 当然这个也可以加入运算中
    let a= 2;
    a **= 4;
    console.log("指数",a) // 16
}

八、说在最后

本来一直想把基本的扩展都讲完的,无奈时间也差不多到点了,所幸明天就到周五了。在这周末我一定会将所有的es6总结清楚。当然我这个代码也会在整理的差不多之后传到github供大家查阅。同时我这代码肯定有参考阮一峰大大的文章,如果存在疑虑额,请参考 ECMAScript 6 入门。老规矩,12点洗澡去了。

相关文章

  • 我所了解的es6(02)

    话说最近大事儿有点勤啊。昨天下班的时候还聊到,google研制出了一款可以写前端代码。我们一群程序员底层人员还在担...

  • 我所了解的es6(01)

    最近也是高考季了,首先在这里恭祝所有的高考学子一声--高考快乐。顺便也说一句过来人的忠告:高考只是决定你去哪个地方...

  • 我所了解的自己

    如果说年岁的增长,让我最大的收获是什么,那就是我更加了解我自己,看到我自己 真诚而不世故 勇敢不怯懦 独立而自主 ...

  • 我所了解的张爱玲

    读张爱玲,就像看一部励志电影,她是一个拥有传奇人生的女子,还好我足够幸运能品读她不平凡的人生。 张爱玲出生在...

  • 我所了解的土耳其

    买了去土耳其的往返机票,却迟迟没有认真做攻略,距离出发的时间越来越近了,于是开始突击看土耳其相关的各种资料,主要包...

  • 我所了解的MassGrid

    有人说ASIC矿机的出现,导致竞争加剧,成本上升,抬高了币价, 这简直就是笑话! 价值不应该是由需求决定的吗!! ...

  • 我所了解的图腾

    华灯初上,小雨拍打着玻璃窗,窗外的车流急急地行驶着,我坐在窗前的地毯上,捧起刚买的《中国世界图腾文化》看了起来。 ...

  • 我所了解的张国荣

    作者:谷藜 人世间有一种美好的样子,他叫张国荣。 (一)出生 伟大的人总有坎坷的命运,就像划过天际的流星,在璀璨夺...

  • 我所了解的父母

    今天的题目是我一直想写又怯于下笔的 。 在我们小时候,“原生家庭”这个洋气的词听都没听过,所以从小便没有跳出家庭审...

  • 我所了解的Butterknife

    简书第一篇讲一下用的很普遍也很多人写的ButterKnife! 不管是简书还是其他博客上都很多人讲述过Butte...

网友评论

      本文标题:我所了解的es6(02)

      本文链接:https://www.haomeiwen.com/subject/mjebsftx.html