我试图理解为什么我的输入是falsy
> palindrome('abaasa')
false
鉴于这种回文检查功能
function palindrome(str) {
return str.split('').every((char, i) => {
return char === str[str.length - i - 1];
});
}
根据我的理解,every
助手对数组中的每个值进行布尔检查。
当分解时,它对我来说就像这样。
(0 => a) === (5 => a) // truthy <--- START
(1 => b) === (4 => s) // falsy
(2 => a) === (3 => a) // truthy
我知道有比实际更多的比较,我知道这需要优化。
继续迭代,这是指针相交的地方。
(3 => a) === (2 => a) // truthy
(4 => b) === (1 => s) // falsy
(5 => a) === (0 => a) // truthy <--- STOP
题
every
方法是否足够聪明,在发现虚假比较时返回false?如果不是如何根据我的功能确定
falsy
回归?
您可以通过在console.log
函数中引入every
语句来检查它是否足够智能。这将允许您实际查看它停止的位置。
function palindrome(str) {
return str.split('').every((char, i) => {
console.log(i);
return char === str[str.length - i - 1];
});
}
let str = 'abaasa';
console.log(palindrome(str)); // prints: 0 1 false
每个方法足够智能,当它找到一个虚假的比较时返回false吗?
正如你所看到的,它足够聪明,可以在一个假的后停下来。当它总共达到5时,它只通过了0和1。
every()
函数用于对数组中的每个元素执行布尔检查。
所以如果你有:
const array = [0, 10, 14];
问题是你想知道该数组中的每个值是否大于5。
您可以编写一些看起来像这样的代码:
array.every((val) => val > 5);
我们将获取数组,在其上调用every()
函数并传入一个函数来调用数组中的每个元素。所以我传入val
并检查0是否大于5将返回false。
当every()
函数运行时,它检查每个函数运行的return
值,如果任何函数返回false,那么整个表达式也返回false,但是如果它为每个元素返回true,则整个函数表达式返回true。
因此它返回数组中每个元素的比较。
请记住,通过使用every()
数组助手来解决回文,您正在做两倍的工作。这是一个解决方案,但它的工作量是它需要的两倍。
所以你的原因归结为因为每个角色都不是另一方角色的镜像。
你在这说什么是:
return char === str[str.length - i - 1];
返回第一个元素和数组另一侧的镜像元素之间的比较。
[abaasa]
a === a // true
b === s // false
a === a // true
那里有一个假,所以它不是回文。
它是一个回文:
[abaaba]
a === a // true
b === b // true
a === a // true