網站首頁 編程語言 正文
大家好,我是一碗周,一個不想被喝(內卷)的前端。如果寫的文章有幸可以得到你的青睞,萬分有幸~
面試官:['1', '2', '3'].map(parseInt)
的結果是什么?為甚?
我:[1, 2, 3]
。
面試官:你不用來了。
寫在前面
今天看到一道題,['1', '2', '3'].map(parseInt)
的結果是什么?看到這個題下意識的覺得答案就是[1, 2, 3]
,但實際上,答案是[1, NaN, NaN]
,這是為什么呢?我們來一探究竟。
parseInt函數
首先我們來看一下parseInt()
函數,關于parseInt()
函數,MDN中是這樣介紹的:parseInt(string, radix)
將一個字符串string
轉換為radix
進制的整數, radix
為介于2-36
之間的數。返回解析后的整數值。 如果被解析參數的第一個字符無法被轉化成數值類型,則返回NaN
。
到這為止,我們對parseInt()
函數有了一個基礎的了解,根據上面的描述,也就是說我們為parseInt()
的第二個參數傳遞一個非2-36
之間的數,返回結果是NaN
,我們來測試一下:
console.log(parseInt(10, 0)) // 10
console.log(parseInt(10, 1)) // NaN
console.log(parseInt(10, 37)) // NaN
按照我們的思路,這里的結果應該是3個NaN
,但實際并不是,關于radix
參數,在MDN中有明確的解釋:
如果 radix 是 undefined、0或未指定的,JavaScript會假定以下情況:
1. 如果輸入的 string以 "0x" 或 "0x"(一個0,后面是小寫或大寫的X)開頭,那么radix被假定為16,字符串的其余部分被當做十六進制數去解析。
2. 如果輸入的 string 以 "0"(0)開頭, radix 被假定為8(八進制)或10(十進制)。具體選擇哪一個radix取決于實現。ECMAScript 5 澄清了應該使用 10 (十進制),但不是所有的瀏覽器都支持。因此,在使用parseInt時,一定要指定一個 radix。
3. 如果輸入的 string 以任何其他值開頭, radix 是 10 (十進制)。
這就解釋了我們的parseInt(10, 0)
的結果是10了。
Array.prototype.map方法
現在我們來了解一下map方法的作用,該方法接受兩個參數,第一個是一個回調函數,數組中的每一項都會執行該函數,這個回調函數接受三個參數,第一個是正在處理的元素,第二個是正在處理的索引,第三個是當前數組;第二個參數是調用回調函數的this
。
下面代碼中展示了Array.prototype.map
方法的基礎用法:
function doubleNum(n, i) {
let doubleN = 2 * n
console.log(`第{i+1}個元素的的二倍是${doubleN}`)
return doubleN
}
let newArr = [1, 2, 3].map(doubleNum)
console.log(newArr)
/* 執行結果如下:
第{i+1}個元素的的二倍是2
第{i+1}個元素的的二倍是4
第{i+1}個元素的的二倍是6
[ 2, 4, 6 ]
*/
如果上面的寫法看不懂,我們可以將函數移動一下位置,代碼如下:
let newArr = [1, 2, 3].map(function (n, i) {
let doubleN = 2 * n
console.log(`第{i+1}個元素的的二倍是${doubleN}`)
return doubleN
})
解題
經過上面的介紹,現在我們應該已經知道的這個題的結果了,它的運行情況如下:
-
parseInt('1', 0)
,直接按照10進制解析,結果為1; -
parseInt('2', 1)
,傳入了非2~36
的值,結果為NaN; -
parseInt('3', 2)
,按照2進制進行解析,2進制可以解析的數字只有1和0,所以返回NaN
。
知道了這一題的答案,我們來看一下下面這個代碼片段,它的運行結果又是什么:
['10','10','10','10','10'].map(parseInt);
- 首先
parseInt('10', 0)
的結果是10,不用解釋; - 然后
parseInt('10', 1)
的結果是NaN,我們前面也解釋過了; -
parseInt('10', 2)
的結果是2,這是因為10被轉換為二進制就是2; -
parseInt('10', 3)
的結果是3,10被轉換為三進制就是3; -
parseInt('10', 4)
以此類推。
最終結果是[10, NaN, 2, 3, 4]
。
原文鏈接:https://blog.csdn.net/weixin_46163658/article/details/122181490
相關推薦
- 2022-03-26 C++的缺省參數你了解嘛_C 語言
- 2022-07-22 C/C++冒泡排序
- 2022-05-20 Kafka 認證登錄注意事項
- 2023-07-10 如何實現Spring AOP以及Spring AOP的實現原理
- 2022-05-21 基于C++實現酒店管理系統_C 語言
- 2022-08-18 C++詳解如何實現單鏈表_C 語言
- 2022-07-27 Python?pyecharts?Line折線圖的具體實現_python
- 2022-03-30 python實現記事本功能_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支