es6前端技术(es6新增了哪些特性)

公交号

5.1 Number.isFinite(), Number.isNaN()

Number.isFinite() 用于检查一个数值是否是有限的,即不是Infinity,若参数不是Number类型,则一律返回false 。

Number.isFinite(10); // trueNumber.isFinite(0.5); // trueNumber.isFinite(NaN); // falseNumber.isFinite(Infinity); // falseNumber.isFinite(-Infinity); // falseNumber.isFinite('leo'); // falseNumber.isFinite('15'); // falseNumber.isFinite(true); // falseNumber.isFinite(Math.random()); // true

Number.isNaN()用于检查是否是NaN,若参数不是NaN,则一律返回false。

Number.isNaN(NaN); // trueNumber.isNaN(10); // falseNumber.isNaN('10'); // falseNumber.isNaN(true); // falseNumber.isNaN(5/NaN); // trueNumber.isNaN('true' / 0); // trueNumber.isNaN('true' / 'true'); // true

区别:

与传统全局的isFinite()和isNaN()方法的区别,传统的这两个方法,是先将参数转换成数值,再判断。

而ES6新增的这两个方法则只对数值有效, Number.isFinite()对于非数值一律返回false,Number.isNaN()只有对于NaN才返回true,其他一律返回false。

isFinite(25); // trueisFinite("25"); // trueNumber.isFinite(25); // trueNumber.isFinite("25"); // falseisNaN(NaN); // trueisNaN("NaN"); // trueNumber.isNaN(NaN); // trueNumber.isNaN("NaN"); // false

5.2 Number.parseInt(), Number.parseFloat()

这两个方法与全局方法parseInt()和parseFloat()一致,目的是逐步减少全局性的方法,让语言更模块化。

parseInt('12.34'); // 12parseFloat('123.45#'); // 123.45Number.parseInt('12.34'); // 12Number.parseFloat('123.45#'); // 123.45Number.parseInt === parseInt; // trueNumber.parseFloat === parseFloat; // true

5.3 Number.isInteger()

用来判断一个数值是否是整数,若参数不是数值,则返回false。

Number.isInteger(10); // trueNumber.isInteger(10.0); // trueNumber.isInteger(10.1); // false

5.4 Math对象的拓展

ES6新增17个数学相关的静态方法,只能在Math对象上调用。

  • Math.trunc:
  • 用来去除小数的小数部分,返回整数部分。
  • 若参数为非数值,则先转为数值。
  • 若参数为空值或无法截取整数的值,则返回NaN。
// 正常使用Math.trunc(1.1); // 1Math.trunc(1.9); // 1Math.trunc(-1.1); // -1Math.trunc(-1.9); // -1Math.trunc(-0.1234); // -0// 参数为非数值Math.trunc('11.22'); // 11Math.trunc(true); // 1Math.trunc(false); // 0Math.trunc(null); // 0// 参数为空和无法取整Math.trunc(NaN); // NaNMath.trunc('leo'); // NaNMath.trunc(); // NaNMath.trunc(undefined); // NaN

ES5实现:

Math.trunc = Math.trunc || function(x){ return x < 0 ? Math.ceil(x) : Math.floor(x);}
  • Math.sign():
  • 判断一个数是正数、负数还是零,对于非数值,会先转成数值。
  • 返回值:
  • 参数为正数, 返回 +1
  • 参数为负数, 返回 -1
  • 参数为0, 返回 0
  • 参数为-0, 返回 -0
  • 参数为其他值, 返回 NaN
Math.sign(-1); // -1Math.sign(1); // +1Math.sign(0); // 0Math.sign(-0); // -0Math.sign(NaN); // NaNMath.sign(''); // 0Math.sign(true); // +1Math.sign(false);// 0Math.sign(null); // 0Math.sign('9'); // +1Math.sign('leo');// NaNMath.sign(); // NaNMath.sign(undefined); // NaN

ES5实现

Math.sign = Math.sign || function (x){ x = +x; if (x === 0 || isNaN(x)){ return x; } return x > 0 ? 1: -1;}
  • Math.cbrt():
  • 用来计算一个数的立方根,若参数为非数值则先转成数值。
Math.cbrt(-1); // -1Math.cbrt(0); // 0Math.cbrt(1); // 1Math.cbrt(2); // 1.2599210498Math.cbrt('1'); // 1Math.cbrt('leo'); // NaN

ES5实现

Math.cbrt = Math.cbrt || function (x){ var a = Math.pow(Math.abs(x), 1/3); return x < 0 ? -y : y;}
  • Math.clz32():
  • 用于返回一个数的 32 位无符号整数形式有多少个前导 0。
Math.clz32(0) // 32Math.clz32(1) // 31Math.clz32(1000) // 22Math.clz32(0b01000000000000000000000000000000) // 1Math.clz32(0b00100000000000000000000000000000) // 2
  • Math.imul():
  • 用于返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数。
Math.imul(2, 4) // 8Math.imul(-1, 8) // -8Math.imul(-2, -2) // 4
  • Math.fround():
  • 用来返回一个数的2位单精度浮点数形式。
Math.fround(0) // 0Math.fround(1) // 1Math.fround(2 ** 24 - 1) // 16777215
  • Math.hypot():
  • 用来返回所有参数的平方和的平方根。
Math.hypot(3, 4); // 5Math.hypot(3, 4, 5); // 7.0710678118654755Math.hypot(); // 0Math.hypot(NaN); // NaNMath.hypot(3, 4, 'foo'); // NaNMath.hypot(3, 4, '5'); // 7.0710678118654755Math.hypot(-3); // 3
  • Math.expm1():
  • 用来返回ex - 1,即Math.exp(x) - 1。
Math.expm1(-1) // -0.6321205588285577Math.expm1(0) // 0Math.expm1(1) // 1.718281828459045

ES5实现

Math.expm1 = Math.expm1 || function(x) { return Math.exp(x) - 1;};
  • Math.log1p():
  • 用来返回1 + x的自然对数,即Math.log(1 + x)。如果x小于-1,返回NaN。
Math.log1p(1) // 0.6931471805599453Math.log1p(0) // 0Math.log1p(-1) // -InfinityMath.log1p(-2) // NaN

ES5实现

Math.log1p = Math.log1p || function(x) { return Math.log(1 + x);};
  • Math.log10():
  • 用来返回以 10为底的x的对数。如果x小于 0,则返回 NaN。
Math.log10(2) // 0.3010299956639812Math.log10(1) // 0Math.log10(0) // -InfinityMath.log10(-2) // NaNMath.log10(100000) // 5

ES5实现

Math.log10 = Math.log10 || function(x) { return Math.log(x) / Math.LN10;};
  • Math.log2():
  • 用来返回以 2 为底的x的对数。如果x小于0,则返回 NaN。
Math.log2(3) // 1.584962500721156Math.log2(2) // 1Math.log2(1) // 0Math.log2(0) // -InfinityMath.log2(-2) // NaNMath.log2(1024) // 10Math.log2(1 << 29) // 29

ES5实现

Math.log2 = Math.log2 || function(x) { return Math.log(x) / Math.LN2;};
  • 双曲函数方法:
  • 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)

5.5 指数运算符

新增的指数运算符(**):

2 ** 2; // 42 ** 3; // 8 2 ** 3 ** 2; // 相当于 2 ** (3 ** 2); 返回 512

指数运算符(**)与Math.pow的实现不相同,对于特别大的运算结果,两者会有细微的差异。

Math.pow(99, 99)// 3.697296376497263e+19799 ** 99// 3.697296376497268e+197

公众号:前端自习课

文章版权声明:除非注明,否则均为公交号原创文章,转载或复制请以超链接形式并注明出处。