Как работает строковый метод replace с кареткой в ​​качестве регулярного выражения и функцией String в качестве аргументов? - PullRequest
0 голосов
/ 11 января 2019

Я просматриваю какой-то целенаправленный запутанный код для онлайн-вызова. Я ищу разъяснения по линии. Я знаю, что это вернет истину, точно так же как! '' Вернет истину. Но похоже, что остальная часть кода никогда ничего не сделает. Я предполагаю, что это просто, чтобы проблема выглядела более запутанной. Буду признателен за некоторые глубокие технические подробности происходящего.

Я знаю, что код возвращает в настоящее время, но мне интересно, как это работает на более глубоком уровне. Я посмотрел на строковый метод replace и понял, как он может использовать регулярное выражение и функцию, которая работает с каждым совпадением. Я также посмотрел на функцию String и понял, что она просто преобразует вещи в строки. Я знаю, что регулярные выражения совпадают с началом строки.

// note: typeof String === "function"
!''.replace(/^/, String)

Ответы [ 3 ]

0 голосов
/ 11 января 2019
'hello'.replace(/^/, 'world'); // 'worldhello'
'hello'.replace(/e/, String); // 'hello'
'hello'.replace(/^/, String); // 'hello'
''.replace(/^/, String); // ''
!''.replace(/^/, String); // true

Заменить на String ничего не делает.

Отрицание '' приведение '' к логическому значению (т. Е. Ложному) и отрицание его.

И вуаля, у вас это есть, !''.replace(/^/, String) оценивает как истинное.

0 голосов
/ 11 января 2019

Лучший способ объяснить, что он делает, - сначала немного усложнить.

Первое, на что нужно обратить внимание, - это то, что метод String.prototype.replace() при вызове с функцией обратного вызова пропустит match, затем любые захваченные группы (в данном случае ни одной), затем offset, затем string в качестве аргументов, поэтому его можно развернуть следующим образом:

!''.replace(/^/, (match, offset, string) => String(match, offset, string))

Теперь, когда String() вызывается как статический метод (без оператора new), он принимает свой первый параметр и преобразует его в строку, игнорируя остальные параметры переданы:

console.log(String('foo', 0, 'foo bar')) // 0, 'foo bar' ignored

Учитывая это, мы можем теперь упростить выражение до этого:

!''.replace(/^/, match => match)

, поскольку match уже является строкой. Теперь /^/ соответствует сечению нулевой ширины в начале строки, к которой вызывается метод, и replace() вставляет возвращаемое значение функции обратного вызова в то же место. Поскольку match является возвращаемым значением, целое .replace(/^/, match => match) не вызывает побочных эффектов, поэтому выражение теперь эквивалентно:

!''

И, как вы уже указали, '' - ложь, поэтому !'' оценивается как true.

0 голосов
/ 11 января 2019

Ты слишком много думаешь, ''.replace(/^/, String) действительно не делает абсолютно ничего, чего не делает ''.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...