Я не понимаю, что представляет собой "chr" в этой функции. Я понимаю, что «совпадение» должно представлять каждый символ в строке, которая соответствует регулярному выражению, а «chr» должно быть чем-то, что используется для определения того, является ли каждый символ прописным или строчным, но я не знаю, как это работает или как это определяет истинные/ложные значения.

let swapcase = str => {
  return str.replace(/([a-z]+)|([A-Z]+)/g, (match, chr) => {
    if (chr) {
      return match.toUpperCase()
    } else {
      return match.toLowerCase()
    }
  })
}
console.log(swapcase('DdishDJSK')) // logs dDISHdjsk
1
Nico Federico 29 Окт 2019 в 19:29
1
 – 
Daniel A. White
29 Окт 2019 в 19:30
2
В регулярном выражении есть две разные группы захвата. chr относится только к группе захвата, используемой для символов нижнего регистра.
 – 
Patrick Roberts
29 Окт 2019 в 19:33
str.replace(/[a-z]/ig, c => String.fromCharCode(c.charCodeAt(0) ^ 0x20)); будет эквивалентно.
 – 
Patrick Roberts
29 Окт 2019 в 19:35
Верно, но в зависимости от деталей кодировки ASCII это плохой стиль.
 – 
Barmar
29 Окт 2019 в 19:57

1 ответ

Ваше регулярное выражение:

/([a-z]+)|([A-Z]+)/g

Состоит из двух «компонентов» (в скобках), и каждая совпадающая строка может соответствовать первому или второму компоненту.

chr здесь относится ко всему, что соответствует первому компоненту, т. е. если ваша строка совпадает с первым компонентом, chr будет равна вашей строке. В противном случае он будет оцениваться как undefined.

В вашем конкретном случае это означает, что если ваше совпадение в нижнем регистре, chr будет равно этому совпадению, и поэтому if(chr) будет преобразовано в true. Если ваше совпадение в верхнем регистре, chr будет неопределенным, а if(chr) будет преобразовано в false.

1
Anis R. 29 Окт 2019 в 19:41
К вашему сведению, «компоненты» обычно называются «группами захвата».
 – 
Barmar
29 Окт 2019 в 19:54
Значит ли это, что если бы был третий параметр после 'chr', он бы относился ко второму компоненту или группе захвата регулярного выражения?
 – 
Nico Federico
29 Окт 2019 в 21:45
Да, точно.
 – 
Anis R.
29 Окт 2019 в 21:56