我很想知道为什么提供不完整的输出(以及为什么不起作用)

时间:2015-11-10 02:22:30

标签: javascript

播放“你不能在压力下javascript”其中一个练习就是这个。

function longestString(i) {

    // i will be an array.
    // return the longest string in the array

    return i.reduce(function(last, current) {
        console.log(current);
        console.log(typeof current);
        return (typeof current == 'string' && current.length > last.length) ? current : last;
    });
}

问题是,如果你调用函数

longestString([true,false,'lol']);

不仅它不起作用(是的,我知道如何使用for循环,我不想讨论实现,但为什么这个特定的不起作用),奇怪的部分是输出:

longestString([true,false,'abc']);
> false
> boolean
> abc
> string
> true

这很奇怪,因为,如果你在数组中有3个元素,并且每个元素的回调中有2个console.logs ......你可以算一算。

一些意见表示赞赏。

1 个答案:

答案 0 :(得分:1)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

  

如果未提供initialValue,则previousValue将等于数组中的第一个值,currentValue将等于第二个值。

这不是JavaScript中的错误。

您的回调函数被调用两次。

第一个电话:

last = true
current = false
typeof current = boolean
typeof current == 'string' && current.length > last.length = false
所以回调返回true

第二个电话:

last = true
current = 'abc'
typeof current = string
typeof current == 'string' && current.length > last.length = false
所以回调返回true

我建议您将实施更改为:

return i.reduce(function (last, current) {
    console.log(current);
    console.log(typeof current);
    return (typeof current == 'string' && current.length > last.length) ? current : last;
}, ''); //  <-- empty string