JavaScript学习笔记--ES6学习(五) 数值的扩展

ES6 对于数值类型 (Number) 进行了一下扩展:

1.对于二进制和八进制提供了新的写法

ES6对于二进制和八进制的数值提供了新的写法,分别用0b (或者0B) 和0o (或者0o) 表示。例如:

0b111110111 === 503  // true

0o767 === 503  //true

由于从ES5开始,严格模式中,八进制不再允许使用前缀0来表示,因此在ES6中进一步明确,要用0o来表示。

如果要将0b和0o前缀的字符串数值转换为十进制,要使用Number方法, 例如:

var integerNumber = Number(0b111110111);

integerNumber // 503

2.ES6在Number对象新增了方法:

(1)Number.isFinite()

Number.isFinite()方法用来检查一个数值是否是有限的(finite), 使用举例:

Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false
Number.isFinite(‘foo‘); // false
Number.isFinite(‘15‘); // false
Number.isFinite(true); // false

(2)Number.isNaN()

Number.isNaN() 方法用来检查一个值是否是NaN, 使用如下:

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

Number.isNaN 以及 Number.isFinite() 与传统的方法isNaN()和isFinite()的区别在于: 传统的方法中,首先将参数转换为数值类型(用Number())然后再判断,而这两个方法只对数值有效,非数值类型一律返回false。 这从上面的例子也可以看出。

(3)Number.parseInt(), Number.parseFloat()

ES6 中将全局方法parseInt() 和parseFloat() 移植到了Number对象上,行为完全保持不变:

Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true

这样做的好处是逐步的替代全局方法。这也是ES6的方向。

(4)Number.isInteger()

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

在JavaScript的内部,整数和浮点数是使用同样的存储方法,因此3 和3.0 被视为同一个值。 因此需要有一个方法来区分整数和浮点数。

同样,isInteger()只对数值类型有效:

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

(5)Number.EPSILON

Number.EPSILON是ES6在Number对象上新增的一个极小常量,目的在于为浮点数计算设置一个误差范围。

由于JavaScript中浮点数的计算并不精确,浮点数的计算误差如果能小鱼Number.EPSILON,就可以认为得到了正确结果,因此, Number.EPSILON的实质是一个可以接受的误差范围。

(6) 安全整数

JavaScript能够精确标识 的整数范围在 -2^53 到 2^53之间(不含两端),超过这个范围就无法精确表示。

因此,ES6引入了Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 这两个常量,用来标识这个范围的上下限。

Number.isSafeInteger()方法 用来判断一个整数是否在这个安全范围之内,同时,不是number的参数一律返回false:

Number.isSafeInteger(‘a‘) // false
Number.isSafeInteger(null) // false
Number.isSafeInteger(NaN) // false
Number.isSafeInteger(Infinity) // false
Number.isSafeInteger(-Infinity) // false

Number.isSafeInteger(3) // true
Number.isSafeInteger(1.2) // false
Number.isSafeInteger(9007199254740990) // true
Number.isSafeInteger(9007199254740992) // false

Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false

3.ES6 对Math对象进行了扩展:

(1)Math.trunc()

Math.trunc()方法用于去除一个数的小数部分,返回整数部分。对于非数值类型,Math.trunc() 方法内部使用Number() 方法将参数先转为数值,然后再计算。对于无法截取证书的,返回NaN。

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(NaN);      // NaNMath.trunc(‘foo‘);    // NaN

Math.trunc();         // NaN

(2)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
Math.sign(‘foo‘); // NaN
Math.sign();      // NaN

(3)Math.cbrt()

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

Math.clz32() 返回一个数的32为无符号整数形式有多少个前导0:

Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1000) // 22
Math.clz32(0b01000000000000000000000000000000) // 1
Math.clz32(0b00100000000000000000000000000000) // 2

clz : count leading zero bits in 32-bit binary representations of a number  (计算32位整数的前导0)

左移运算符(<<)和Math.clz32() 方法直接相关:

Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1 << 1) // 30
Math.clz32(1 << 2) // 29
Math.clz32(1 << 29) // 2

对于小数,Math.clz32方法只考虑整数部分。

Math.clz32(3.2) // 30
Math.clz32(3.9) // 30

(4)Math.hypot()

Math.hypot() 方法返回所有参数的平方和的平方根:

Math.hypot(3, 4);        // 5    3^2 + 4 ^2 = 5^2
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

4.指数运算符

ES7新增了一个指数运算符(**) 目前Babel转码器已经支持

2 ** 2 // 4
2 ** 3 // 8
时间: 2024-10-19 22:46:37

JavaScript学习笔记--ES6学习(五) 数值的扩展的相关文章

JavaScript 学习笔记-- ES6学习(一)介绍以及Babel的使用

本文摘自阮一峰老师的<ECMAScript 6入门>,原文地址:http://es6.ruanyifeng.com/#docs/intro ECMAScript 6 是一个泛指,含义是5.1版本后的JavaScript的下一代标准,涵盖了ES2015, ES2016, ES2017等. Babel转码器是一个广泛使用的ES6转码器,可以将ES6转码为ES5. 配置文件:.babelrc 配置文件基本格式: // .babelrc{ "presets": [], "

JavaScript学习笔记 -- ES6学习(二) let 和const

ES6 中新增了两个命令: let 和const. let命令: let 用于声明变量,和var 类似,但是所声明的变量只在代码块中有效,不存在变量提升,有暂时性死区. 1.只在代码块中有效 和var 命令不同的是,let 声明的变量只在代码块中有效,例如 { let a = 1; var b = 2; } console.log(b); // print 2; console.log(a); // this will cause error. 2. 不存在变量提升 所谓变量提升,就是在同一作用

JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值

1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, b, c] = [1, 2, 3]; 如果解构不成功,对应的变量就会赋值undefined. let [x, y, ...z] = ['a']; x // "a" y // undefined z // [] 另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组.这种情况

VSTO学习笔记(十五)Office 2013 初体验

原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 2013平台,即VSTO 5.0. 本系列所有测试代码均在Visual Studio 2012 Ultimate RC + Office 2013 Professional Plus x64 Preview 上测试通过 为了配合Windows 8,微软的很多软件风格都逐渐Metro化,Office作为拳头

Android学习笔记(十五)——碎片的生命周期(附源码)

碎片的生命周期 点击下载源码 与活动类似,碎片具有自己的生命周期.理解了碎片的生命周期后,我们可以在碎片被销毁时正确地保存其实例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Fragments,在Fragment1.java文件中添加如下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragm

马哥学习笔记二十五——ISCSI协议,架构及其安装配置

ISCSI监听在tcp/3260端口 iSCSI Target:iscsi-target-utils 客户端认正方式: 1.基于IP 2.基于用户,CHAP tgtadm:命令行工具,模式化命令 --mode 常用模式:target,logicalunit,account target --op new.delete.show.update.bind.unbind logicalunit --op new.delete account --op new.delete.bind.unbind --

Android学习笔记二十五之ListView多布局实现

Android学习笔记二十五之ListView多布局实现 这一节是介绍ListView这个控件的最后一节,实现一个Item的多布局.像我们经常在用的各种即时通讯工具,QQ.微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,这一节,我们就来实现一个ListView的多种Item. 要实现ListView里面有多种Item,就要重写适配器的两个方法getViewTypeCount()和getItemViewType(int position),第一个方法是

【Unity 3D】学习笔记四十五:游戏实例——击垮围墙

用这个游戏实例来总结之前我们复习的所有关于物理引擎的知识.在游戏中,发送一个球形的炮弹来击垮前面的墙.给炮弹与墙都添加了刚体组件,给炮弹绑定了粒子系统,并且在炮弹的粒子动画中添加了5组不同的颜色,显示移动轨迹. using UnityEngine; using System.Collections; public class Script_06_14 : MonoBehaviour { //炮弹对象 private GameObject obj; //准心贴图 public Texture te

angular学习笔记(二十五)-$http(3)-转换请求和响应格式

本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({ transformRequest: function(data){ //对前台发送的data进行处理 return data } }) 这个在测试的时候遇到了很大的问题.只要经过transformRequest函数处理,哪怕是不做任何处理,node后台都会报错,需要尝试使用php 2. transformResp