Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Number静态方法 #2

Open
btea opened this issue Jun 15, 2020 · 0 comments
Open

Number静态方法 #2

btea opened this issue Jun 15, 2020 · 0 comments
Labels

Comments

@btea
Copy link
Owner

btea commented Jun 15, 2020

Number静态方法

  • Number.isFinite()
  • Number.isInteger()
  • Number.isNaN()
  • Number.isSafeInteger()
  • Number.parseFloat()
  • Number.parseInt()

这篇主要介绍一下Number对象上的静态方法,包括es6新增的一些同名方法。

Number.isFinite 与 isFinite

Number.isFinite()isFinite()方法都是用来检测传入的参数是否是一个有穷数(finite number)
语法

Number.isFinite(value)
isFinite(value)

参数

value 要被检测有穷性的值。

返回值

返回一个 布尔值,表示给定的值是否是一个有穷数。

两个函数功能相似,但也有一些区别:
1、Number.isFinite是es6新增的方法。
2、Number.isFinite不会对传入的参数进行类型转换,如果传入的参数不是number类型,则直接返回false。全局 isFiniite 函数则不一样,这个方法会对传入的参数先调用Number()处理,然后对处理之后的值进行判断。

Number.isFinite(Infinity)   // false 
Number.isFinite(-Infinity)  // false
Number.isFinite(NaN)        // false
Number.isFinite(0)          // true
Number.isFinite('')         // false
Number.isFinite([])         // false

isFinite(Infinity)   // false 
isFinite(-Infinity)  // false
isFinite(NaN)        // false
isFinite(0)          // true
isFinite('')         // true
isFinite([])         // true

Polyfill

Number.isFinite = Number.isFinite || function(value) {
    return typeof value === 'number' && isFinite(value)
}

Number.isInteger

Number.isInteger()方法是es6新增的方法,用来判断给定的参数是否为整数。
语法

Number.isInteger(value)

参数

value 参数可以是任意类型,如果为非number类型,可直接返回 false,否则,判断传入的参数是否是整数。

返回值

返回一个布尔值,表示传入的参数是否为整数。

如果参数不是number类型,直接返回false

Number.isInteger()      // false  
Number.isInteger(null)  // false
Number.isInteger('15')  // false
Number.isInteger([10])  // false
Number.isInteger(true)  // false

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

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

由于JavaScript采用 IEE754标准,数值存储为64位双精度格式,数值精度最多可达到53个二进制位。因此,对于一些超出范围的数值,部分位数可能会被丢弃,导致函数结果出现误判。
1、丢弃超出存储范围的位数

Number.isInteger(3.0000000000000002) // true
Number.isInteger(3.0000000000000012) // false

上面代码中,Number.isInteger的参数明明不是整数,但是会返回true。原因就是这个小数的精度达到了小数点后16个十进制位,转成二进制位超过了53个二进制位,导致最后的那个2被丢弃了。
2、数值超出JavaScript能分辨出的最大、最小值。

// Number.MIN_VALUE
Number.isInteger(5e-324) // false
Number.isInteger(5e-325) // true

// Number.MAX_VALUE
Number.isInteger(1.7976931348623157e+308) // true
Number.isInteger(1.7976931348623157e+309) // false

上面代码中,5E-325由于值太小,会被自动转为0,因此返回true。下面的数值,由于超过最大值,返回Infinity,所以返回false
Polyfill

Number.isInteger = Number.isInteger || function(value) {
    return Number.isFinite(value) && Math.floor(value) === value;
};

Number.isNaN与isNaN

Number.isNaN()isNaN() 方法用来判断传递的值是否为NaN
语法

Number.isNaN(value)   
isNaN(value)

参数

value 要检测是否为NaN的值。可以为任意类型。

返回值

返回一个布尔值,表示给定的参数是否为NaN

两个函数功能相似,但有以下区别:
1、Number.isNaN()是es6新增的方法,isNaN()则是一个全局方法。
2、Number.isNaN()方法不会对参数进行转换,而isNaN()方法则会先将参数转换为number类型,再进行判断。

Number.isNaN(NaN)          // true
Number.isNaN(Number.NaN)   // true
Number.isNaN(0 / 0)        // true

Number.isNaN('NaN')        // false
Number.isNaN(undefined)    // false
Number.isNaN({})           // false
Number.isNaN('')           // false

isNaN('NaN')               // true
isNaN(undefined)           // true
isNaN({})                  // true
isNaN('')                  // false

Polyfill

Number.isNaN = Number.isNaN || function(value) {
    return typeof value === 'number' && value !== value;
};

Number.isSafeInteger()

Number.isSafeInteger()方法时es6新增方法,用来哦安短参数是否是一个安全整数(safe integer)
安全整数为符合以下条件的整数:

  • 可以准确地表示为一个IEE754双精度数字;
  • 其IEE754表示不能是舍入任何其他整数以适应IEE-754表示的结果。

安全整数范围为 -(253 - 1)253 - 1之间,包括边界。
语法

Number.isSafeInteger(testValue)

参数

testValue 需要检测的参数。

返回值

返回一个布尔值,表示给定的值是否是一个安全整数(safe integer)。

Polyfill

Number.isSafeInteger = Number.isSafeInteger || function(value) {
    return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER
}

Number.parseFloat()与parseFloat()

Number.parseFloat()方法用来把一个字符串解析成浮点数。

Number.parseFloat === parseFloat // true

语法

Number.parseFloat(string)

参数

string被解析的字符串。

返回值

传入的参数被解析成浮点数,如果无法被解析成浮点数,则返回NaN

// 在解析过程过程,如果遇到 **正号(+)**、**负号(-)**、**数字(0-9)**、**小数点(.)**或者科学计数法中的**指数(e或E)**以外的字符,
// 则忽略该字符以后的所有字符,返回当前已经解析到的浮点数。  
parseFloat('a')     // NaN
parseFloat('1a')    // 1
parseFloat('1ea')   // 1
parseFloat('1e1a')  // 10 
parseFloat('-1e2a') // -100

// 第二个小数点的出现也会使解析停止
parseFloat('1.23')  // 1.23
parseFloat('1.2.3') // 1.2

// 参数的首位和末位的空白符会被忽略
parseFloat('010')   // 10
parseFloat(' 010 ') // 10

// 如果参数字符串的第一个字符不能被解析成数字,则返回 NaN
parseFloat('a1')    // NaN

// 返回 Infinity
parseFloat(1 / 0)   // Inifinity

// 解析 BigInt 时,丢失精度,末尾 n 字符会被丢弃
parseFloat('10n')   // 10
parseFloat(10n)     // 10

// 可以用来将获取的元素几何样式的值转化为 number
parseFloat('121.5px')  // 121.5

Number.parseInt()与parseInt()

Number.parseInt()方法依据指定基数[参数radix的值],把字符串[参数string]解析成整数。

Number.parseIntparseInt相等, Number.parseInt === parseInt // true

语法

Number.parseInt(string[, radix])

参数

string: 要被解析的值,如果参数不是 字符串 ,则默认将其转化为字符串。字符串开头的空白可被忽略。  
radix: 一个2到36之间的整数值,用于指定转换中采用的基数。 若超出范围([2-36]),则返回NaN。  
如果省略或者传入值为0,则会以10为基数来解析。  
如果string以 "0x"或者"0X"开头,则以16位基数来解析。  
如果string以 "0"开头,在ECMA3中被认为是8进制;但是在ECMA5中则已经修改成此情况下默认是10进制了。   

返回值

返回NaN,或者解析后的整数。

parseInt(1/0)      //  NaN
// 1 / 0  =>  Infinity  转换成字符串  'Infinity'
// 默认没有传基数时,以10位基数来解析,10进制里面不包含 'I' 字符,所以直接返回 `NaN`。
parseInt(1/0, 19)  //  18
// 19进制里面 'i' 为有效字符,转换成10进制之后,结果为 18。

parseInt(false, 16) // 250   'f' 以及 'a' 为16进制有效字符, 15 * 16 + 10 => 250
parseInt(parseInt, 16) // 15
parseInt("0x10") //  16
parseInt("10",2) // 2 

最后,关于parseInt,一道很有意思的面试题。

参考资料:

@btea btea added the js基础 label Jun 17, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant