JS 回文检查 "every" 辅助方法分解

JS palindrome check with "every" helper method breakdown

我想了解为什么我的输入是 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 

问题

Is the every method smart enough to return false when it finds a falsy comparison?

If not how was the falsy return determined given my function?

.every()

正在检查每个条件是否为真 (y)。如果其中任何一个被评估为 false,那么它将 return false。这就是 doc 对其 return 的描述:

true if the callback function returns a truthy value for every array element; otherwise, false.

您可以通过在 every 函数中引入 console.log 语句来检查它是否足够智能。这将使您实际看到它停止的地方。

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

Is the every method smart enough to return false when it finds a falsy comparison?

如您所见,足够聪明,可以在出现错误后停止。它只经过索引 0 和 1 时总共可以达到 5

every() 函数用于对数组中的每个元素进行布尔检查。

所以如果你有:

const array = [0, 10, 14];

问题是您想知道该数组中的每个值是否都大于 5。

您可以编写如下代码:

array.every((val) => val > 5);

我们将获取数组,对其调用 every() 函数并传入一个函数来调用数组中的每个元素。所以我传入 val 并检查 0 是否大于 5,这会 return false.

every() 函数 运行s 它检查每个函数 运行 的 return 值,如果任何函数 returns false 那么整个表达式 return 也是假的 ,但是如果每个元素 return 都为真,则整个函数表达式 return 为真。

所以它return是对数组中每个元素的比较。

请记住,使用 every() 数组助手来解析回文,您所做的工作是原来的两倍。这是一个解决方案,但它所做的工作是它需要做的两倍。

所以你 return 编造假的原因是因为每个角色都不是另一边角色的镜像。

你在这里说的是:

return char === str[str.length - i - 1];

return 第一个元素与数组另一侧的镜像元素之间的比较。

[abaasa]

a === a // true
b === s // false
a === a // true

那里有假所以不是回文

如果是回文:

[abaaba]

a === a // true
b === b // true
a === a // true