JS Math与一些原始类型

2023-03-10,,

镇楼图

Pixiv:DSマイル



一、值属性、函数

globalThis

JS有全局对象,但是在不同环境中全局对象均不同。在Web环境中,window、self、frames取得全局对象,在Web Workers环境中self为全局对象,在Node环境中global为全局对象。这样子并不统一,于是globalThis成了任意环境下统一的一个全局对象

console.log(globalThis);
//在浏览器环境中会显示Window

NaN

NaN表示非数字,在Number中也有,它代表了不可运算,任何与NaN的运算都会返回NaN

但是如果要判断值是否为NaN,则需要使用isNaN方法来判断,NaN与任何值包括自身逻辑运算都是false

isNaN和Number.isNaN的区别是isNaN会先尝试将类型转换成NaN才判断值是否为NaN,而Number.isNaN不会进行类型转换

console.log(NaN === NaN);//false
console.log(isNaN("hello"));//true
console.log(Number.isNaN("hello"));//false

isFinite()

Number类型大致分为有限值、NaN、正无穷、负无穷。isFinite用来判断值是否为有限值

console.log(isFinite(0/0));//false
console.log(isFinite(3.1415926));//true

parseFloat(str)

console.log(parseFloat("3.1415926"));
//将输入转换为浮点数
//若转换失败则返回NaN

parseInt(str, radix)

console.log(parseInt("3.14"));//3
console.log(parseInt("15", 8));//13 //将输入根据radix进制转换为十进制整数
//radix最多36,默认为10
//若转换失败则返回NaN

二、Boolean

Boolean是boolean原始类型的包装类,除了转换原始值的方法外没有任何属性、方法

转换原始值 返回
Boolean.prototype.toString() "true"或"false"
Boolean.prototype.valueOf() Boolean类型原始值

三、Math

Math可提供常用的数学方法,但仅用于Number类型,不支持BigInt类型

常用属性

常用属性 说明
Math.E \(e\)
Math.LN2 \(ln~2\)
Math.LN10 \(ln~10\)
Math.LOG2E \(log_2e\)
Math.LOG10E \(lg~e\)
Math.PI \(π\)
Math.SQRT1_2 \(\frac{1}{\sqrt{2}}\)
Math.SQRT2 \(\sqrt{2}\)

三角函数

对于三角函数而言,返回的是弧度制而非角度制

三角函数 说明
Math.sin(x) \(sin(x)\)
Math.sinh(x) \(sinh(x)\)
Math.asin(x) \(arcsin(x)\)
Math.asinh(x) \(arcsinh(x)\)
Math.cos(x) \(cos(x)\)
Math.cosh(x) \(cosh(x)\)
Math.acos(x) \(arccos(x)\)
Math.acosh(x) \(arccosh(x)\)
Math.tan(x) \(tan(x)\)
Math.tanh(x) \(tanh(x)\)
Math.atan(x) \(arctan(x)\)
Math.atanh(x) \(arctanh(x)\)
Math.atan2(y,x) \((x,y)\)与\((0,0)\)构成的直线与x轴正方向间的弧度

指数、对数方法

指数、对数方法 说明
Math.sqrt(x) \(\sqrt{x}\)
Math.cbrt(x) \(x^3\)
Math.exp(x) \(e^x\)
Math.expm1(x) \(e^x-1\)
Math.log2(x) \(log_2(x)\)
Math.log10(x) \(lg(x)\)
Math.log(x) \(ln(x)\)
Math.log1p(x) \(ln(x+1)\)

数论方法

数论方法 说明
Math.sign(x) 根据正负性、0以及特殊情况返回1,-1,0,-0,NaN
1代表正数,-1代表负数
Math.abs(x) \(|x|\)
Math.ceil(x) \(⌈x⌉\)
Math.floor(x) \(⌊x⌋\)
Math.round(x) 返回四舍五入后的整数
Math.trunc(x) 返回数的整数部分
Math.hypot(x,[y,...]) \(\sqrt{∑i^2}\)
返回所有参数平方和之和的平方根
Math.max([x,y,...]) 返回所有参数中的最大值
若没有参数返回Infinity
Math.min([x,y,...]) 返回所有参数中的最小值
若没有参数返回Infinity

Math.random()可以返回0~1均匀分布的随机数,这个函数虽然非常简单,但若读者有概率统计的基础,这个方法将会变得非常复杂且有用。

二进制相关方法

二进制相关方法 说明
Math.clz32(x) 将数转成32位无符号二进制数后
返回开头0的个数
如\(Math.clz32(2)=30\)
Math.fround(x) JS内置使用64位双浮点数
此方法可以转成最接近32位单浮点数的数
但本质依然是64位双浮点数
Math.imul(a,b) 先将参数转换位32位整数再相乘(一般没什么用)

■fround方法使用中如果超出了32位单浮点数的范围,则会返回无穷大

console.log(2 ** 150);//某个非常大的数
console.log(Math.fround(2 ** 150));//Infinity

四、Number

特殊值

属性 说明
Number.NaN 同NaN
Number.NEGATIVE_INFINITY 负无穷
Number.POSITIVE_INFINITY 正无穷

关于无穷大的运算比较特殊

■0与无穷相乘为NaN

■无穷与无穷相除为NaN

■无穷相加减任何有限值都是本身

■正无穷乘正值(包括正无穷)为正无穷

■正无穷乘负值(包括负无穷)为负无穷

■负无穷乘正值(包括正无穷)为负无穷

■负无穷乘负值(包括负无穷)为正无穷

■除法在被除数是无穷除数是有限值的情况下与乘法相同

■任意数除以无穷为0

转换原始值

转换原始值 说明
Number.prototype.toString([radix]) radix默认为10
根据进制来转成String值
Number.prototype.valueOf() 返回原始值

String转Number

String转Number 说明
Number.parseFloat(str) 参考parseFloat方法
Number.parseInt(str,[radix]) 参考parseInt方法

Number转String

Number转String 说明
Number.prototype.toLocaleString(locales, options) 详细见MDN,根据应用来输出不同格式的字符串
Number.prototype.toExponential([fracDigits]) 按科学计数法来输出字符串
fracDigits指定小数位,默认用尽可能多的小数位
Number.prototype.toFixed([digits]) 按digits即保留小数位位数的多少来输出
digits默认为0
Number.prototype..toPrecision([precision]) 按precision即有效数字个数来输出
忽略pricision行为类似于toString方法

双浮点数的内部属性

内部属性 说明
Number.MAX_VALUE 最大正值,接近1.79E+308
Number.MIN_VALUE 最小正值,接近5e-324
Number.MAX_SAFE_INTEGER 最大安全整数,9007199254740991
Number.MIN_SAFE_INTEGER 最小安全整数,-9007199254740991
Number.EPSILON 1与超过1的最小浮点数的差值

MAX_VALUE是64位双浮点数的最大表示范围,如果超出则会按Infinty即无穷来处理。而MIN_VALUE则是代表精度的极限范围,如果超出精度范围直接当0处理。由于浮点数的特性,小数有偏差已经是默认情况了,但是整数如果出现偏差则是不被允许的情况(如果你想表达1结果输出2,这肯定是不被允许的),因此另外一个范围是整数的安全范围,在此安全范围内整数一定不会出现偏差。

EPSILON可用于比较浮点数,因为浮点数的偏差一般是不能直接用相等来比较的。而是采用\(|实际值-期望值|<最小精度\)来判断,而最小精度就是EPSILON

console.log(0.1 + 0.2 === 0.3);//false
console.log(Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON);//true function EqualFloat(a, b){
//抽象成函数
//a是实际值,b是期望值
//判断a是否等于b
return (Math.abs(a-b) < Number.EPSILON);
}

判断类型方法

判断类型方法 说明
Number.isNaN(x) 判断是否为NaN
Number.isFinite(x) 判断是否为有限值,即不是NaN、Infinity
Number.isInteger(x) 判断是否为整数
Number.isSafeInteger(x) 判断是否为安全整数

五、BigInt

运算符支持情况

基本的运算符大部分都能支持,>>>因为要兼容asm.js不能使用也不能使用单目运算符+

由于是整数,对于除法来说就变成了整除

就比较运算符而言,它可以和Number无缝连接,但不能使用严格比较符,两者的类型并不相同

转换原始值

转换原始值 说明
BigInt.prototype.toString([radix]) 详细参考Number,但BigInt后的n并不会算在内
BigInt.prototype.valueOf() 返回BigInt的原始值

BigInt转String

BigInt转String 说明
BigInt.prototype.toLocaleString(locales,options) 详细参考Number

二进制相关方法

二进制相关方法 说明
BigInt.asIntN(width,bigint) 返回\(bigint\%2^{width}\)的有符号整数
BigInt.asUintN(width,bigint) 返回\(bigint\%2^{width}\)的无符号整数

因为BigInt没有上限值,这两种方法可以有效地设定上限

其中asIntN限制于\((-2^{width},2^{width})\),asUintN限制于\((0,2^{width})\)

const max = 2n ** 64n;//最大值设定在2^64内

function CheckRange(bigint){
//如果相等说明数据在范围内
//否则超出范围,返回异常值undefined
return (BigasUintN(64,bigint) === bigint) ? bigint : undefined;
}


参考资料

[1] 《JavaScrpit DOM 编程艺术》

[2] MDN

[3] 现代JS教程

[4] 黑马程序员 JS pink

JS Math与一些原始类型的相关教程结束。

《JS Math与一些原始类型.doc》

下载本文的Word格式文档,以方便收藏与打印。