lodash裡to系列之將資料轉換成數字型別實現示例詳解
導讀 | 這篇文章主要為大家介紹了lodash裡to系列之將資料轉換成數字型別實現示例詳解,有需要的朋友可以借鑑參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪 |
在lodash裡的to系列裡,將目標資料轉換為數字型別的資料的方法,包括了toNumber方法、toFinit方法、toInteger方法,toSafeInteger方法,下面來看看各個方法的使用和實現。
toNumber方法主要是將引數value轉換為一個數字型別。
使用如下:
toNumber(3.2) // => 3.2 toNumber(Number.MIN_VALUE) // => 5e-324 toNumber(Infinity) // => Infinity toNumber('3.2') // => 3.2
toNumber方法在實現上藉助了內部封裝的is系列方法,主要是isObject方法和isSymbol方法。
實現上藉助typeof,具體處理如下:
- 對於資料型別直接返回引數。
- 對於symbol型別直接返回NaN。
- 對於物件型別,分兩種情況處理。
- 如果引數原型鏈上存在valueOf方法,直接呼叫其返回結果供後續處理。
- 如果引數原型鏈上不存在valueOf方法,直接轉換成字串型別供後續處理。
- 對於非字串型別的,呼叫隱式轉換。
- 對於其他型別的,會進行正則匹配處理資料格式,reTrim是去除空格,reIsBadHex是去除十六進位制,reIsBinary是去除二進位制,reIsOctal是去除八進位制。
- 對於二進位制和八進位制的字串會呼叫原生的parseInt方法將引數轉換為相應的進位制數。而對於十六進位制則返回NaN,否則呼叫隱式轉換。
原始碼如下:
import isObject from './isObject.js' import isSymbol from './isSymbol.js' const NAN = 0 / 0 const reTrim = /^\s+|\s+$/g const reIsBadHex = /^[-+]0x[0-9a-f]+$/i const reIsBinary = /^0b[01]+$/i const reIsOctal = /^0o[0-7]+$/i const freeParseInt = parseInt function toNumber(value) { if (typeof value === 'number') { return value } if (isSymbol(value)) { return NAN } if (isObject(value)) { const other = typeof value.valueOf === 'function' ? value.valueOf() : value value = isObject(other) ? `${other}` : other } if (typeof value !== 'string') { return value === 0 ? value : +value } value = value.replace(reTrim, '') const isBinary = reIsBinary.test(value) return (isBinary || reIsOctal.test(value)) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : (reIsBadHex.test(value) ? NAN : +value) }
toFinit方法主要是將引數value轉換為一個有限的數字。
使用如下:
toFinite(3.2) // => 3.2 toFinite(Number.MIN_VALUE) // => 5e-324 toFinite(Infinity) // => 1.7976931348623157e+308 toFinite('3.2') // => 3.2
toFinit方法實現上藉助toNumber方法,具體處理如下:
原始碼如下:
import toNumber from './toNumber.js' const INFINITY = 1 / 0 const MAX_INTEGER = 1.7976931348623157e+308 function toFinite(value) { if (!value) { return value === 0 ? value : 0 } value = toNumber(value) if (value === INFINITY || value === -INFINITY) { const sign = (value < 0 ? -1 : 1) return sign * MAX_INTEGER } return value === value ? value : 0 }
toInteger方法主要是將引數value轉換為一個整數。
使用如下:
toInteger(3.2) // => 3 toInteger(Number.MIN_VALUE) // => 0 toInteger(Infinity) // => 1.7976931348623157e+308 toInteger('3.2') // => 3
實現上藉助toFinite方法,首先呼叫toInteger方法將引數轉換為有限的值,然後透過取模操作獲取小數部分,然後取差值。
原始碼如下:
import toFinite from './toFinite.js' function toInteger(value) { const result = toFinite(value) const remainder = result % 1 return remainder ? result - remainder : result } export default toInteger
toSafeInteger方法主要是將引數value轉換為安全整數,安全整數可以用於比較和準確的表示。
使用如下:
toSafeInteger(3.2) // => 3 toSafeInteger(Number.MIN_VALUE) // => 0 toSafeInteger(Infinity) // => 9007199254740991 toSafeInteger('3.2') // => 3
toSafeInteger方法在實現上主要透過toInteger方法,同樣的,對於不存在的引數直接返回引數,而0則返回0。對於小於最小安全數MAX_SAFE_INTEGER則返回MAX_SAFE_INTEGER,值都將限制在[-MAX_SAFE_INTEGER,MAX_SAFE_INTEGER]的區間。
原始碼如下:
import toInteger from './toInteger.js' const MAX_SAFE_INTEGER = 9007199254740991 function toSafeInteger(value) { if (!value) { return value === 0 ? value : 0 } value = toInteger(value) if (value < -MAX_SAFE_INTEGER) { return -MAX_SAFE_INTEGER } if (value > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER } return value } export default toSafeInteger
本篇章我們瞭解了toNumber、toFinit、toInteger以及toSafeInteger四個方法,在實現上依次藉助呼叫實現。
toNumber方法是其他方法的核心,其他方法是toNumber方法的擴充。toNumber方法的核心是isObject和isSymbol兩個判斷方法。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2913727/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Blob實現與File DataURL canvas相互轉換示例詳解Canvas
- C#資料型別及其轉換詳解C#資料型別
- 數字型別的不正確轉換漏洞型別
- fwMySql資料型別教程示例詳解MySql資料型別
- JS裡的資料型別轉換JS資料型別
- JS 裡的資料型別轉換JS資料型別
- Kotlin 資料型別詳解:數字、字元、布林值與型別轉換指南Kotlin資料型別字元
- Python將經緯度資料轉換成浮點資料Python
- WebSocket系列之JavaScript數字資料如何轉換為二進位制資料WebJavaScript
- JavaScript 資料型別轉換詳細解釋已經parseInt等JavaScript資料型別
- [Java基礎]之 資料型別轉換Java資料型別
- lodash原始碼分析之獲取資料型別原始碼資料型別
- CAPL指令碼中常用到的資料型別轉換——數字型別(int/double)和字串型別(char array)指令碼資料型別字串
- JS中的資料型別轉換:String轉換成Number的3種方法JS資料型別
- 資料型別轉換資料型別
- JavaScript之number型別的數值轉換成某某進位制JavaScript型別
- 將json資料轉換為Python字典將json資料轉換為Python字典JSONPython
- Java入門系列-05-資料型別和型別轉換Java資料型別
- 資料型別,型別轉換資料型別
- 關於mysql字元和數字型別轉換的問題研究MySql字元型別
- 實時獲取建材網商品資料:API實現詳解與程式碼示例API
- Restcloud ETl實踐之資料行列轉換RESTCloud
- Python基礎之集合和資料型別轉換Python資料型別
- 5.JavaScript資料型別之間的轉換JavaScript資料型別
- 用Java實現samza轉換成flinkJava
- 將表結構轉換成實體欄位
- JavaScript 資料型別轉換JavaScript資料型別
- javascript資料型別轉換JavaScript資料型別
- 【Java】資料型別轉換Java資料型別
- 資料型別及轉換資料型別
- JSON序列化時將BigDecimal型別轉換成String型別JSONDecimal型別
- js將有父子關係的資料轉換成樹形結構資料JS
- Oracle blob型別資料轉換成 base64編碼Oracle型別
- voc資料集轉換成coco資料集
- JavaScript變數與資料型別詳解JavaScript變數資料型別
- 轉換成浮點數
- 轉換成為整數
- Spring框架系列(11) - Spring AOP實現原理詳解之Cglib代理實現Spring框架CGLib