关于Nodejs中map的一个问题,表示很不科学啊

关于Nodejs中map的一个问题,表示很不科学啊

var p = parseInt;
var print = console.log;
for (var i = 1; i < 20; i++) {
var b = []
for(var j = 1; j <= i ; j++) {
b.push(j + ‘’);
}
console.log(b);
console.log(’-> map parseInt, result:’, b.map(parseInt));
}

大家跑下这个程序,然后和我解释下好么~


4 回复

当然可以。让我们来分析一下你提供的代码,并解释为什么会出现你认为“不科学”的结果。

首先,我们来看一下这段代码的逻辑:

var p = parseInt;
var print = console.log;
for (var i = 1; i < 20; i++) {
    var b = [];
    for(var j = 1; j <= i ; j++) {
        b.push(j + '');
    }
    console.log(b);
    console.log('-> map parseInt, result:', b.map(parseInt));
}

这段代码的主要目的是生成一个数组 b,其中包含从 1i 的字符串形式的数字,然后使用 map 方法将这些字符串转换为整数。

问题所在

问题出在 b.map(parseInt) 这一行。parseInt 函数有两个参数:第一个是要解析的字符串,第二个是基数(例如二进制、八进制、十进制等)。当你调用 b.map(parseInt) 时,map 会传递三个参数给 parseInt:当前元素、当前索引以及数组本身。

具体来说,parseIntmap 中的行为可以理解为:

  • 当前元素(字符串形式的数字)
  • 当前索引(从 0 开始)
  • 数组本身(在这个上下文中没有被使用)

示例解释

假设 b[ '1', '2', '3' ],那么 map 会依次调用 parseInt 如下:

  • parseInt('1', 0)
  • parseInt('2', 1)
  • parseInt('3', 2)

由于 parseInt 的第二个参数是基数,当基数为 0 或非 10 时,它会被忽略,因此 parseInt('1', 0)parseInt('1') 是等价的,结果都是 1。但是,当基数为 1 或更高时,parseInt 会尝试将其作为基数来解析,这可能会导致意外的结果。

预期与实际结果

预期结果应该是 [1, 2, 3],但实际结果可能不是这样的,因为基数的影响。具体结果取决于基数值的变化。

正确的写法

为了正确地将字符串数组转换为整数数组,你可以使用箭头函数:

console.log('-> map parseInt, result:', b.map(str => parseInt(str)));

这样,parseInt 只会接收到一个参数(当前元素),避免了基数的影响,从而得到正确的结果。

希望这个解释能帮助你更好地理解 map 方法在使用 parseInt 时的行为。


parseInt的参数问题

楼上正解。不过有一点小小的瑕疵,没有把parselnt 的结果返回。 console.log(’-> map parseInt, result:’, b.map(function(n){return parseInt(n,10);})); 这样就能跑出正确的结果。已测试。

在这个代码片段中,b.map(parseInt) 的结果可能与预期不符。parseInt 函数在使用时需要一个基数参数(例如 parseInt(str, radix)),而 map 方法会传递三个参数给 parseInt,分别是当前元素、当前索引以及数组本身。

具体来说,在每一行循环中,b.map(parseInt) 传递给 parseInt 的参数实际上是 (j + '', index, b)。这意味着 parseInt 实际上会被调用为 parseInt('1', 1, ['1', '2']) 这样的形式,导致它将第二个参数作为基数,而第二个参数并不是一个有效的基数,这会导致一些意外的结果。

示例代码

var p = parseInt;
var print = console.log;

for (var i = 1; i < 20; i++) {
    var b = [];
    for (var j = 1; j <= i; j++) {
        b.push(j + '');
    }
    console.log(b);
    console.log('-&gt; map parseInt, result:', b.map((item) => parseInt(item)));
}

解释

为了避免这种问题,可以使用箭头函数来明确传递单一参数给 parseInt,如上面的代码所示。这样 parseInt 将只接收到当前元素作为参数,从而得到正确的结果。

回到顶部