Js將字符串轉數字的方式
Js
字符串轉換數字方方式主要有三類:轉換函數、強制類型轉換、弱類型隱式類型轉換,利用這三類轉換的方式可以有5
種轉換的方法。
parseInt()
parseInt()
和Number.parseInt()
是最常用的轉換字符串為整數數值的方法,其中Number.parseInt()
是ES6
之后為了減少全局方法的定義才增加的靜態方法,實質與全局方法parseInt()
相同,他們的規則如下:
- 忽略字符串前面的空格,直至找到第一個非空字符。
- 如果第一個非空字符不是數字或者是正負號則返回
NaN
。 - 如果第一個是數字字符一直解析到一個非數字字符。
- 如果第一個是數字字符,能識別出各種整數格式。
- 接受第二個參數,即轉換時使用的基數。
- 小數向下取整。
console.log(Number.parseInt(true)); // NaN
console.log(Number.parseInt(false)); // NaN
console.log(Number.parseInt(null)); // NaN
console.log(Number.parseInt(undefined)); // NaN
console.log(Number.parseInt(NaN)); // NaN
console.log(Number.parseInt(" 123")); // 123
console.log(Number.parseInt(" ab123")); // NaN
console.log(Number.parseInt("")); // NaN
console.log(Number.parseInt(" 31avs")); // 31
console.log(Number.parseInt("0xF")); // 15
console.log(Number.parseInt("070")); // es3->56 es5->70
console.log(Number.parseInt("A", 16)); // 10
console.log(Number.parseInt("A")); // NaN
console.log(Number.parseInt("51.2")); // 51
console.log(Number.parseInt("-51.2")); // -51
parseFloat()
parseFloat()
和Number.parseFloat()
是最常用的轉換字符串為浮點數數值的方法,其中Number.parseFloat()
是ES6
之后為了減少全局方法的定義才增加的靜態方法,實質與全局方法parseFloat()
相同,他們的轉換規則如下:
- 忽略字符串前面的空格,直至找到第一個非空字符。
- 如果第一個非空字符不是數字或者是正負號則返回
NaN
。 - 如果第一個是數字字符一直解析到一個非數字字符。
- 字符串中第一個小數點是有效的第二個小數點是無效的。
- 只解析
10
進制,不接受第二個參數。
console.log(Number.parseFloat(true)); // NaN
console.log(Number.parseFloat(false)); // NaN
console.log(Number.parseFloat(null)); // NaN
console.log(Number.parseFloat(undefined)); // NaN
console.log(Number.parseFloat(NaN)); // NaN
console.log(Number.parseFloat("123")); // 123
console.log(Number.parseFloat(" 123.1")); // 123.1
console.log(Number.parseFloat(" ab123.1")); // NaN
console.log(Number.parseFloat("")); // NaN
console.log(Number.parseFloat(" 123.3.4eqw")); // 123.3
console.log(Number.parseFloat("0xF")); // 0
Number()
Number()
構造函數會返回一個字面量值,而使用new Number()
則會返回一個數字對象,他們的轉換規則如下:
- 如果是
Boolean
值,true
和false
分別返回1
或0
。 - 如果是數字,只是單純的傳入和返回。
- 如果是
null
,則返回0
。 - 如果是
undefined
返回NaN
。 - 如果是字符串且字符串為空則返回零,忽略前導零。
- 如果是字符串且字符串為整數則返回整數,忽略前導零。
- 如果是字符串且字符串為浮點數則返回浮點數。
- 如果是字符串且字符串為
16
進制,轉為10
進制返回。 - 除以上格式返回
NaN
。 - 如果是對象,則調用對象的
valueOf
,按照前面的規則返回值,如果返回NaN
,再調用toString()
,按照前面的規則返回值。
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
console.log(Number(NaN)); // NaN
console.log(Number("")); // 0
console.log(Number("123")); // 123
console.log(Number(" 123")); // 123
console.log(Number("123.12")); // 123.12
console.log(Number("0xF")); // 15
位運算
位運算是直接對二進制位進行計算,它直接處理每一個比特位,是非常底層的運算,好處是速度極快,缺點是很不直觀。位運算只對整數起作用,如果一個運算數不是整數,會自動轉為整數后再運行。在JavaScript
內部,很多時候數值都是以64
位浮點數的形式儲存,但是做位運算的時候,是以32
位帶符號的整數進行運算的,並且返回值也是一個32
位帶符號的整數。
// ~~
console.log(~~(true)); // 1
console.log(~~(false)); // 0
console.log(~~(null)); // 0
console.log(~~(undefined)); // 0
console.log(~~(NaN)); // 0
console.log(~~("")); // 0
console.log(~~("123")); // 123
console.log(~~(" 123")); // 123
console.log(~~("123.12")); // 123
console.log(~~("0xF")); // 15
// <<
console.log(true << 0); // 1
console.log(false << 0); // 0
console.log(null << 0); // 0
console.log(undefined << 0); // 0
console.log(NaN << 0); // 0
console.log("" << 0); // 0
console.log("123" << 0); // 123
console.log(" 123" << 0); // 123
console.log("123.12" << 0); // 123
console.log("0xF" << 0); // 15
// >>
console.log(true >> 0); // 1
console.log(false >> 0); // 0
console.log(null >> 0); // 0
console.log(undefined >> 0); // 0
console.log(NaN >> 0); // 0
console.log("" >> 0); // 0
console.log("123" >> 0); // 123
console.log(" 123" >> 0); // 123
console.log("123.12" >> 0); // 123
console.log("0xF" >> 0); // 15
一元運算符
一元運算符可以將字符串進行隱式的類型轉換,與其它的解析方式不同,如果是一個NaN
值,那么返回的也是NaN
,通常使用+
操作符,因為這個方式不容易混淆。
console.log(+(true)); // 1
console.log(+(false)); // 0
console.log(+(null)); // 0
console.log(+(undefined)); // NaN
console.log(+(NaN)); // NaN
console.log(+("")); // 0
console.log(+("123")); // 123
console.log(+(" 123")); // 123
console.log(+("123.12")); // 123
console.log(+("0xF")); // 15
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://www.jianshu.com/p/7962deab3cea
https://juejin.im/post/6855129005897711624
https://blog.fundebug.com/2018/07/07/string-to-number/