播放“你不能在压力下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 ......你可以算一算。
一些意见表示赞赏。
答案 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