整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

ES6新增数值的扩展

ES6新增数值的扩展

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

ES6在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法

Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infinity;

Number.isFinite(12) // true
Number.isFinite(0.8) // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false
Number.isFinite('foo'); // false
Number.isFinite(true); // false

只要参数类型不是数字,则Number.isFinite一律返回false;

Number.isNaN()用来检查一个值是否为NaN

	Number.isNaN(NaN) // true
	Number.isNaN(15) // false
	Number.isNaN(9/NaN) // true
	Number.isNaN('true' / 0) // true
	Number.isNaN('true' / 'true') // true

如果参数类型不是NaN,Number.isNaN一律返回false

2.Number.parseInt(), Number.parseFloat()

ES6将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持一致

// ES5的写法
parseInt('12.34') // 12
parseFloat('123.45#') // 123.45
// ES6的写法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45

这样做的目的,是逐步减少全局方法,使得语言逐步模块化。

3. Number.isInterger()

Number.isInterger()用来判断一个数值是否为整数

Number.isInteger(25) // true
Number.isInteger(25.1) // false
Number.isInteger(25.0) // true

JavaScript 内部,整数和浮点数采用的是同样的储存方法,所以 25 和 25.0 被视为同一个值

如果参数不是整数值,Number.isInterger()返回false

4.Math.trunc()

Math.trunc()方法用于去除一个数的小鼠部分,返回整数部分

	Math.trunc(4.1) // 4
	Math.trunc(4.9) // 4
	Math.trunc(-4.1) // -4
	Math.trunc(-4.9) // -4
	Math.trunc(-0.1234) // -0

对于非数值,Math.trunc内部使用Number方法将其先转化为数值。

Math.trunc('123.456') // 123
Math.trunc(true) //1
Math.trunc(false) // 0
Math.trunc(null) // 0

对于空值和无法截取整数的值,返回NaN。

Math.trunc(NaN); // NaN
Math.trunc('foo'); // NaN
Math.trunc(); // NaN
Math.trunc(undefined) // NaN

5.Math.sign()

Math…sign()方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。

Math.sign()方法返回五种值

-| 参数为正数,返回 +1

-| 参数为负数,返回 -1

-| 参数为0,返回 0

-| 参数为-0,返回 -0

-| 参数为其他值,返回 NaN

Math.sign(-5) // -1
Math.sign(5) // +1
Math.sign(0) // +0
Math.sign(-0) // -0
Math.sign(NaN) // NaN

如果是非数值,会自动转为数值,对于无法转化为数值的值,会返回NaN。

Math.sign('') // 0
Math.sign(true) // +1
Math.sign(false) // 0
Math.sign(null) // 0
Math.sign('9') // +1
Math.sign('foo') // NaN
Math.sign() // NaN
Math.sign(undefined) // NaN

6.Math.cbrt()

Math.cbrt()方法用于计算一个数的立方根。

Math.cbrt(-1) // -1
Math.cbrt(0) // 0
Math.cbrt(1) // 1
Math.cbrt(2) // 1.2599210498948734

7.指数运算符

ES2016中新增了一个指数运算符(**)

2 ** 2==> 2 * 2 // 4
2 ** 3==> 2 * 2 * 2 // 8

类似ES5中的 Math.pow()方法,但是二者在进行特别大的运算时,两者结果会有细微的差距。

Number和Math都属于JavaScript中的内置对象,Number数字类型作为基础数据类型,我们在开发过程中会经常用到,包括数字精度的格式化,还有字符串转换成数字等操作。

Number数字

自带属性值


Number.EPSILON 两个可表示(representable)数之间的最小间隔。

Number.MAX_SAFE_INTEGER JavaScript 中最大的安全整数 (2^53 - 1)。

Number.MAX_VALUE 能表示的最大正数。最小的负数是 -MAX_VALUE。

Number.MIN_SAFE_INTEGER JavaScript 中最小的安全整数 (-(2^53 - 1)).

Number.MIN_VALUE 能表示的最小正数即最接近 0 的正数 (实际上不会变成 0)。最大的负数是 -MIN_VALUE。
 
Number.NaN 特殊的“非数字”值。
 
Number.NEGATIVE_INFINITY 特殊的负无穷大值,在溢出时返回该值。

Number.POSITIVE_INFINITY 特殊的正无穷大值,在溢出时返回该值。

基础使用

new Number实例化数字对象和Number强转数字字符串,两个值的并不相等

var value1=new Number("123");
this.value1=value1;
console.log(`value1===123 is ${value1===123}`); // value1===123 is false

var value2=Number("123");
this.value2=value2;
console.log(`value2===123 is ${value2===123}`); // value2===123 is true




// 判断Number类型
console.log(value1 instanceof Number);
console.log(value2 instanceof Number);

Number将转换字符串为数字


Number("123"); // 123
Number("12.3"); // 12.3
Number("12.00"); // 12
Number("123e-1"); // 12.3
Number(""); // 0
Number(null); // 0
Number("0x11"); // 17
Number("0b11"); // 3
Number("0o11"); // 9
Number("foo"); // NaN
Number("100a"); // NaN
Number("-Infinity"); //-Infinity

Number判断数字是否是NAN


let number1=new Number("123");
let number2=123;
let number3="string";
let number4=null;
console.log(Number.isNaN(number1)); //  false
console.log(Number.isNaN(number2)); //  false
console.log(Number.isNaN(number3)); //  false
console.log(Number.isNaN(number4)); //  false
console.log(Number.isNaN(NaN)); //  true

Number.isFinite 是否是一个有穷数

console.log(Number.isFinite(1 / 0));
// false
console.log(Number.isFinite(10 / 5));
// true
console.log(Number.isFinite(0 / 0));
// false

Number.isInteger 判断给定的参数是否为整数


function checkInteger(x, y) {
  if (Number.isInteger(y / x)) {
    return "整数";
  }
  return "非整数";
}
console.log(checkInteger(5, 10));
// "整数"
console.log(checkInteger(5, 11));
// "非整数"

Number.isSafeInteger 判断传入的参数值是否是一个“安全整数”(safe integer)

备注:

Number.isSafeInteger() 方法用来判断传入的参数值是否是一个“安全整数”(safe integer)。
一个安全整数是一个符合下面条件的整数:
可以准确地表示为一个IEEE-754双精度数字,
其IEEE-754表示不能是舍入任何其他整数以适应IEEE-754表示的结果。.
比如,2^53 - 1 是一个安全整数,它能被精确表示,在任何 IEEE-754 舍入模式(rounding mode)下,没有其他整数舍入结果为该整数。作为对比,2^53 就不是一个安全整数,它* 能够使用 IEEE-754 表示,但是 2^53 + 1 不能使用 IEEE-754 直接表示,在就近舍入(round-to-nearest)和向零舍入中,会被舍入为 2^53。
安全整数范围为 -(2^53 - 1)到 2^53 - 1 之间的整数,包含 -(2^53 - 1)和 2^53 - 1。

Number.isSafeInteger(3); // true
Number.isSafeInteger(Math.pow(2, 53)); // false
Number.isSafeInteger(Math.pow(2, 53) - 1); // true
Number.isSafeInteger(NaN); // false
Number.isSafeInteger(Infinity); // false
Number.isSafeInteger("3"); // false
Number.isSafeInteger(3.1); // false
Number.isSafeInteger(3.0); // true

Number.parseFloat 将字符串数字转成数字类型

备注:

  • 方法可以把一个字符串解析成浮点数。该方法与全局的 parseFloat() 函数相同,并且处于 ECMAScript 6 规范中(用于全局变量的模块化)。
  • 给定值被解析成浮点数,如果无法被解析成浮点数,则返回NaN

function checkFloat(r) {
  return parseFloat(r);
}
console.log(checkFloat(4.567));
// 4.567
console.log(checkFloat("4.567abcdefgh"));
// 4.567
console.log(checkFloat("abcdefgh"));
// NaN


Number.parseInt 将数字字符串转成整数

/**
 *
 * Number.parseInt()
 * 方法依据指定基数 [ 参数 radix 的值],把字符串 [ 参数 string 的值] 解析成整数。
 * @params string:要解析的值。 如果此参数不是字符串,则使用ToString抽象操作将其转换为字符串。忽略此参数中的前导空格。
 * @params radix:一个介于2到36之间的整数,代表字符串的基数(数学数字系统中的基)。小心-这并不是默认为10。
 * 从给定字符串中解析的整数。如果基数小于11,且第一个非空白字符不能转换为数字,则返回NaN。
 *
 * */
 
function checkInt(x, base) {
  const parsed=parseInt(x, base);
  if (isNaN(parsed)) {
    return 0;
  }
  return parsed * 100;
}
console.log(checkInt(" 0xF", 16));
// 1500
console.log(checkInt("321", 2));
// 0

Number.prototype.toFixed() 把数字转换为字符串,返回小数点后有指定位数的数字


var numObj=5.123456;
var n=numObj.toFixed(2); // 5.12


Number.prototype.toPrecision() 以指定的精度返回该数值对象的字符串表示


var numObj=5.123456;
console.log("numObj.toPrecision()  is " + numObj.toPrecision()); // 输出 5.123456
console.log("numObj.toPrecision(5) is " + numObj.toPrecision(5)); // 输出 5.1235
console.log("numObj.toPrecision(2) is " + numObj.toPrecision(2)); // 输出 5.1
console.log("numObj.toPrecision(1) is " + numObj.toPrecision(1)); // 输出 5
// 注意:在某些情况下会以指数表示法返回
console.log((1234.5).toPrecision(2)); // "1.2e+3"

Number 转换 Date 对象


var d=new Date("December 17, 1995 03:24:00");
console.log(Number(d));

结尾

在Number数字类型中,使用最多的应该是:

  • isNaN判断数字是否是非数字NAN
  • parseFloat将数字字符串转成数字类型
  • parseInt 解析字符串转成整数
  • toPrecision作为数字的方法,返回该数值的指定精度,包含小数位
  • toFixed 返回指定小数点精度的数字,需要注意和toPrecision区分开来

源码地址

  • 码云https://gitee.com/lewyon/vue-note
  • githuphttps://github.com/akari16/vue-note

文章来自https://www.cnblogs.com/akari16/p/16201678.html

天给大家分享的是在Javascript中,获取到数字超出长度问题。

实战背景

刚刚收尾的一个移动端商城项目中搭建用户体系的时候,DB设计的User用户表主键ID为bigint(20) 为了达到不重复的问题 Java生成了16-20位不重复的Long类型数字串(具体生成方式也是非常复杂的)。

但是在和web前端API对接的时候发现获取到的ID和生成的不一致,导致操作用户数据的时候一直有问题,最后定位到是ID后端数据类型和Javascript中的数据类型不一致。

问题原因

JavaScript中所有的数字,无论是整数还是小数,其类型均为Number。在程序内部,Number类型的实质是一个64位的浮点数,这与Java中double类型的浮点数是一致的;因此,JavaScript中所有的数都是浮点数。遵循IEEE 754标准(浮点数算术标准),JavaScript所能表示的数值范围为正负1.7976931348623157乘以10的308次方,其最小所能表示的小数为正负5乘以10的负324次方,这两个边界值可以分别通过访问Number对象的MAX_VALUE属性和MIN_VALUE属性来获取。

对于整数,根据ECMAScript标准的要求(http://ecma262-5.com/ELS5_HTML.htm#Section_8.5),JavaScript能表示并进行精确算术运算的整数范围为:正负2的53次方,也即从最小值-9007199254740992到最大值+9007199254740992之间的范围;对于超过这个范围的整数,JavaScript依旧可以进行运算,但却不保证运算结果的精度。值得注意的是,对于整数的位运算(比如移位等操作),JavaScript仅支持32位整型数,也即从-2147483648到+2147483647之间的整数。

我们可以浏览器中测试一下,如下操作

如上图所示 是正常的,那么我们再 +1 试试

看到了吧? 都变了!!!!

解决方案1

数据库设计的时候用varchar(20),那么会映射为String类型,就不会出现这种问题

解决方案2

如果项目已经成型并且修改数据库会造成不可预料的问题那么可以在User对象中再增加一个String类型id映射字段,如下 private Long userId;

private String userIdStr; public String getUserIdStr() { returnthis.userId+"";

} publicvoidsetUserIdStr(String userIdStr) { this.userIdStr=userIdStr;

}

那么和前端交互的时候可以使用userIdStr字段 因为是String 类型的,规避掉这个问题。

以后在设计的时候记得不要再犯这样的问题哦!

更多精彩内容请关注“IT实战联盟”哦~~~