本文最后更新于 150 天前,其中的信息可能已经有所发展或是发生改变。
1、数值
1.1 、JavaScript数值的特点
- 不区分整数值和浮点数值。
- 所有数值均用浮点数值表示。
- 采用IEEE-754标准定义的64位浮点数格式表示。
- 整数在实际操作时(如数组索引),则是基于32为整数。
1.2、 整数直接量
- 除十进制外,JavaScript能识别十六进制(以0x或0X为前缀)、二进制(以0b或0B为前缀)和八进制(以0o或0O为前缀)
如:
0xff —–> 255,
0b1001 —-> 9,
0o12 —–> 10
在ES6的严格模式下,禁止使用八进制
1.3、 浮点数直接量
- 实数写法:由整数部分、小数点和小数部分组成,如:3.1415926535
- 指数写法:在实数部分后跟字母e或E,再跟正负号,再跟一个整型的指 数。如:5.12e12 —>5.12×1012,1.44E-8 —> 1.44×10-8
1.4、算术运算
- 运算符:包括:+、-、*、/、%、**(指数操作符,ES6新增)
- 溢出(overflow)
- 当数值运算结果超过了JavaScript能表示的数值上限时发生。
- 结果为Infinity,若超过了负数范围,则为-Infinity。
- 基于±Infinity的加、减、乘、除等算术运算结果依然是±Infinity。
console.log(Infinity / Infinity) // NaN
-
下溢(underflow)
- 当运算结果无限接近于0,并比JavaScript能表示的最小值还小时发生。
- JavaScript会返回0,若当一个负数发生下溢时,则返回-0。
-
被零整除
- 简单的返回±Infinity
console.log(0 / 0) // NaN
- 简单的返回±Infinity
-
二进制浮点数与四舍五入错误
-
实数有无数个,但JavaScript通过浮点数的形式只能表示有限个数。
-
当JavaScript使用实数时,常常只是真实值的一个近似表示。
-
IEEE-754浮点数表示法是一种二进制表示法,可以精确地表示分数。如:1/2、1/8和1/1024等。
-
但常用的分数都是十进制分数,二进制浮点数并不能精确表示类似0.1这样的简单数值。
console.log(0.3 - 0.2) // 0.09999999999999998
注:在任何的浮点数编程语言中都会遇到这样的问题,无限接近但不等于。 所以尽可能使用大整数进行等比修正以避免该类错误。如2 – 1 -
数值转换
- JavaScript提供了3个函数可将非数值转换为数值,分别为:Number( )、parseInt( )和parseFloat( )
举个例子:console.log(Number(false)) // 0 console.log(Number(null)) // 0 console.log(Number(undefined)) // NaN console.log(Number("110")) // 110 console.log(Number("1.12")) // 1.12 console.log(Number("0xf")) // 15 console.log(Number("")) // 0 console.log(parseInt(1.2)); // 1 console.log(parseInt(0xf)); // 15 console.log(parseInt("0xA")); // 10 console.log(parseInt("A", 16)); // 10 console.log(parseFloat("3.14159e3")); // 3141.59
- JavaScript提供了3个函数可将非数值转换为数值,分别为:Number( )、parseInt( )和parseFloat( )
-
对应与数值的应用类型
创建一个Number对象的构造函数let num=new Number(10); console.log(num) // [Number: 10]
-
Number的常用方法
方法 描述 toString( ) 返回数值对象的字符串表示 toLocaleString( ) 返回数值对象的字符串本地表示 valueOf( ) 返回数值对象的原始数值 toFixed(n) 返回包含指定小数位数的数值字符串 toExponential(n) 返回科学记数法表示的数值字符串 toPrecision(n) 返回数值最恰当的形式 Number.isFinite( ) 用于检查一个数值是否有限的(finite),如果参数类型不是数值,一律返回false Number.isNaN( ) 用于检查一个是否为NaN,如果参数类型不是NaN,一律返回false Number.parseInt( ) ES6将全局方法parseInt( )和parseFloat( )移植到Number对象中,行为完全保持不变 Number.parseFloat( ) ES6将全局方法parseInt( )和parseFloat( )移植到Number对象中,行为完全保持不变 Number.isInteger( ) 用于判断一个数值是否为整数。如果参数不是数值,返回false Number.EPSILON 常量,表示1与大于1的最小浮点数之间的差;用该值来表示JavaScript的最小精度,从而在浮点数运算时用于确定误差范围;这个值减去 1 之后,就等于 2 的 -52 次方 运行结果:
console.log(Number.isFinite(12)) // true console.log(Number.isFinite("12")) // false console.log(Number.isNaN("12")) console.log(Number.isNaN(true)) console.log(Number.parseFloat === parseFloat) //true console.log(Number.parseInt === parseInt) //true console.log(Number.isInteger(12)) //true console.log(Number.isInteger("12")) //false console.log(Number.EPSILON -1) //-0.9999999999999998
-
-
2、Math对象
2.1、说明:
- Math 对象用于执行数学任务。Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math()。
2.2、常见属性
常见属性 | 描述 |
---|---|
E | 返回算术常量e,表示自然对数的底数 |
LN2 | 返回 2 的自然对数 |
LN10 | 返回 10 的自然对数 |
LOG2E | 返回以 2 为底的 e 的对数 |
PI | 表示圆周率,约等于3.14159265 |
SQRT1_2 | 返回 2 的平方根的倒数 |
SQRT2 | 返回 2 的平方根 |
2.3、常见方法
常用方法 | 描述 |
---|---|
Math.ceil( ) | 始终向上舍入为最接近的整数 |
Math.floor( ) | 始终向下舍入最接近的整数 |
Math.round( ) | 执行四舍五入 |
Math.fround( ) | 放回数值最接近的单精度(32位)浮点数表示 |
Math.trunc( ) | 返回给定数字的整数部分 |
Math.random( ) | 返回一个0~1之间的随机数(包含0但不包含1) |
console.log(Math.ceil(3.6)) //4 向上取整
console.log(Math.floor(3.6)) //3 向下取整
console.log(Math.round(3.6)) //4 四舍五入
console.log(Math.fround(3.6)) //3.5999999046325684
console.log(Math.trunc(1.656565111)) // 1
console.log(Math.random()); // 0.32846714436449087
-
例子:编写一个函数randomFrom(lower, upper)返回一个大于或等于lower且小于或等于upper的随机整数
function randomFrom(lower,upper){ var n = Math.floor(Math.abs(upper-lower)+1) var num = Math.floor(Math.random()*n+lower) console.log(num) } randomFrom(1,5)
2.4、其它方法
其它方法 | 描述 |
---|---|
abs(x) | 返回 x 的绝对值 |
acos(x) | 返回 x 的反余弦值 |
asin(x) | 返回 x 的反正弦值 |
atan(x) | 以范围是-PI/2 到 PI/2 弧度的数来返回 x 的反正切值 |
atan2(y,x) | 返回从 x 轴到点 (x,y) 的角度 ,范围是 -PI/2 到 PI/2弧度 |
sin(x) | 返回 x 的正弦值 |
cos(x) | 返回 x 的余弦值 |
tan(x) | 返回 x 的正切值 |
exp(x) | 返回 Ex 的指数 |
log(x) | 返回以e为底数的自然对数 |
max(x,y,z) | 返回x,y,z中的最大值 |
min(x,y,z) | 返回x,y,z中的最小值 |
pow(x,y) | 返回x的y次幂 |
sqrt(x) | 返回x的平方根 |
2.5、Math对象扩展
- Math.cbrt( ) 用于计算一个数的立方根,对于非数值,其内部会先使用,Number( )转换为数值再操作,对于空值和无法截取整数的值,返回NaN
// Math.cbrt console.log(Math.cbrt(8)); // 2
- Math.hypot( ) 用于计算所有参数的平方和的平方根
// Math.hypot console.log(Math.hypot(3,4)); // 5
3、BigInt 简单使用
3.1、BigInt 简介
- 在ES6之后,基本类型增加到了6种:String、Number、Boolean、Null、Undefined、Symbol。如今,BigInt是第七种基本类型。
-
在JavaScript中,Number可以安全的表示的最小和最大整数如下:
一旦超过 53 个二进制位的数值,精度就无法保持,超过 1024 个次方的数值,数值就无法表示。如:console.log(Math.pow(2, 53) == Math.pow(2, 53) + 0.6) // true console.log(Math.pow(2, 1024)) // Infinity
新的数据类型Bigint就解决了这个问题。
3.2、BigInt 基本方法
- 在普通的数字后面加上 n 表示Bigint数据类型,BigInt是另一种类型,它与普通数字并不相等,它也支持其它进制的数值。如:
console.log(typeof (123n)); // bigint console.log(123n == 123) // true console.log(123n === 123) // false console.log(0b1101n) // 13n 二进制 console.log(0o777n) // 511n 八进制 console.log(0xFFn) // 255n 十六进制
-
可以使用Boolean()、Number()和String()这三个方法,将 BigInt 可以转为布尔值、数值和字符串类型。
console.log(Boolean(0n)) // false console.log(Boolean(1n)) // true console.log(Number(1n)) // 1 console.log(String(1n)) // "1"(转换成字符串后面的n会消失) console.log(!0n); // true(也可通过!转换为布尔值)
-
BigInt 类型的加(+),减(-),乘(*),乘方(**)与 Number 类型运算一致。除法运算(/)会舍去小数部分,返回一个整数,如:
console.log(2n+3n) // 5n console.log(2n-3n) // -1n console.log(2n*3n) // 6n console.log(2n**3n) // 8n console.log(2n/3n); // 0n
3.3、BigInt 类型与其它类型的运算规则
- BigInt类型不能和Number,Boolean,undefined,null等基本类型进行运算
- BigInt类型与字符串运算时,会先转成字符串,再进行运算
console.log(2n+3); // TypeError console.log(2n+false); // TypeError console.log(2n+undefined); // TypeError console.log(2n+null);// TypeError console.log(2n+'abc'); // 2abc
3.4、BigInt 对象
console.log(BigInt(123)); // 123n
console.log(BigInt('123')); // 123n
console.log(BigInt(false)); // 0n
console.log(BigInt(true)); // 1n