【问题标题】:Why do String.includes acts different with space characters?为什么 String.includes 与空格字符的行为不同?
【发布时间】:2022-02-16 18:15:53
【问题描述】:

所以,我有这个方法来检查一个对象是否有特定的状态:

export const verifyStatus = (productStatus: string, expectedStatus: string): boolean => {
  return productStatus.split(' ').some((status) => expectedStatus.includes(status));
};

我将以此作为我的价值观:

const productStatus = 'POTATO BANANA TOMATO LETTUCE'
const expectedStatus = 'EGG'

奇怪的是,这是假的:

'POTATO BANANA TOMATO LETTUCE'
    .split(' ')
    .some((status) => 'EGG'.includes(status));

这是真的(注意 POTATO 和 BANANA 之间的双空格)

'POTATO  BANANA TOMATO LETTUCE'
    .split(' ')
    .some((status) => 'EGG'.includes(status));

但是,尽管有任何双空格,这仍然有效(如果我将 EGG 添加到我的第一个字符串,则为 true,如果我删除,则为 false):

'POTATO BANANA TOMATO LETTUCE'
    .split(' ')
    .some((status) => status.includes('EGG'));
'POTATO  BANANA TOMATO LETTUCE'
    .split(' ')
    .some((status) => status.includes('EGG'));

为什么会这样?我错过了什么吗?我使用这种方法大约 5 个月,直到几个小时前它都可以正常工作。

【问题讨论】:

  • 因为"EGG".includes("")true。当你遇到这种事情时,我建议在调试器中单步执行它,看看发生了什么。
  • 使用"EGG".includes(status) 的代码和使用status.includes("EGG") 的代码做了非常不同的事情。你真的想要子字符串匹配吗?

标签: javascript node.js typescript


【解决方案1】:

"EGG".includes("")true"".includes("EGG")false。这就是为什么您从两个版本的代码中得到不同结果的原因。

为什么是""?因为.split(" ") 在一行包含两个空格的字符串上会在数组中放入一个空白字符串:

console.log("TEST  ING".split(" "));

您可以告诉split 使用正则表达式分割任何空格序列 -- .split(/ +/) 仅用于空格,.split(/\s+/) 用于空格运行:

console.log(
    "POTATO  BANANA TOMATO LETTUCE"
        .split(/\s+/)
        .some((status) => "EGG".includes(status))
);

【讨论】:

    【解决方案2】:

    (status) => 'EGG'.includes(status) 询问是否在字符串'EGG'某处 找到status 的值。由双倍空格产生的空字符串'' 显然在多个地方都可以找到。

    如果你只想检查EGG是否在空格分隔的项目中,你应该使用Array.includes

    'POTATO  BANANA TOMATO LETTUCE'
        .split(' ')
        .includes('EGG')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 2022-12-09
      • 2014-06-12
      • 1970-01-01
      • 2013-06-12
      • 2023-04-06
      • 2012-01-10
      相关资源
      最近更新 更多