【问题标题】:Array.from() strange behavior with parseInt() [duplicate]Array.from() parseInt() 的奇怪行为[重复]
【发布时间】:2019-07-02 08:58:39
【问题描述】:

所以我正在尝试使用以下代码将字符串数组转换为数字数组。

let a = ["0", "0"];
let b = Array.from(a, parseInt);
console.log(b);

我得到的是

b = [0, NaN];

我熟悉使用Array.map() 的类似问题,因为它为parseInt() 提供了三个参数,而第二个参数(索引)被parseInt() 解释为基数。但Array.from() 不应该是这样。

有人能给我解释一下吗?

【问题讨论】:

  • 就是map的第二个参数Array.from的方法。
  • 发生这种情况是因为回调函数(在这种情况下为 parseInt)是用两个参数调用的,它们是当前值和原始数组中值的索引。考虑到所说的,parseInt 使用两个参数调用,并且在 parseInt 中,第二个参数是基数:developer.mozilla.org/it/docs/Web/JavaScript/Reference/… 因此第二项中的回调使用值'0' 和基数1 调用,产生NaN
  • 好的,MDN 文档没有指定回调签名。但是和map()是一样的,后面会提到。
  • 把这个Array.from(a, parseInt);改成这个Array.from(a, ([n]) => parseInt(n));这样,你就可以避免隐式参数radix的问题,你从函数Array.from(...)传递索引

标签: javascript arrays parseint


【解决方案1】:

你需要有实际的功能,而不是参考:

let a = ["0", "0"];
let b = Array.from(a, e => parseInt(e));

console.log(b);

问题在于使用 map(这是 Array.from 的第二个参数)将三个参数传递给回调 - 当前项目(您想要的)、索引(不必要的)和数组 (不必要)。所有这三个都应用于parseInt - 所以它看起来像这样:

let b = Array.from(a, (item, index, arr) => parseInt(item, index, arr));

不幸的是,parseInt 使用第二个参数作为它产生的数字的基数(例如,十进制是基数 10,二进制是基数 2,八进制是基数 8,十六进制是基数 16)。传递的第二个参数是索引。因此它试图将0 解析为以 1 为底的数字,但该数字不存在。

您也可以只使用Number 构造函数。

let a = ["0", "0"];
let b = Array.from(a, Number);

console.log(b);

【讨论】:

  • 这似乎有效。我试图避免使用 lambda 函数。是对实际功能的描述和在某处得到很好解释的参考。
  • 你应该解释第二个参数(基数)会发生什么,这是问题的根源。
  • 好吧,我在问题中写道,我知道基数参数的问题。我不知道Array.from() 的工作方式与Array.map() 相同
  • 已编辑@Ele,您(和其他人)能否删除您的反对票?
  • 完成了!! (:
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2013-06-28
  • 2015-07-26
相关资源
最近更新 更多