Другой вопрос JavaScript, который я нашел в Интернете, но я не мог понять, как это работает. Вопрос в основном спрашивает, что такое пароль. Пароль не зависит от внешних ресурсов и не изменяется со временем (не зависит от текущей даты или времени). Кроме того, в вопросе говорится, что есть ровно один правильный пароль. Я начинаю JavaScript, поэтому прошу прощения, если это простой вопрос об стандартном интервью. Это функция:JavaScript: Угадающий пароль
const checkPassword = a => {
if(a !== (a += '')) return false;
if(a !== (a = a.replace(/[^a-z]/g, ''))) return false;
a = (a.match(/^.{6}|.+/g) || []).join(({} + {})[7]);
a = [...a].reverse().join([] + []);
try{
Function('\'' + a + '\';++1..a')();
return false;
}catch(a){
return true;
}
};
alert(checkPassword(prompt('Enter password:')) ? 'Correct password.' : 'Wrong. Try again.');
Сначала это было трудно не выглядеть слишком меня, потому что все открыто, так что я могу просто следовать код построчно и выяснить, как это работает. Хорошо, я понимаю, что в первой строке функции проверки они проверяют, является ли пароль строкой (почему? Это может быть что-то еще?). Затем, если я хорошо понял это регулярное выражение, они проверяют, состоит ли скрипт только в маленьких буквах алфавита (или я ошибаюсь?). Итак, на данный момент я знаю, что знаю, что он должен состоять только из букв. После этого они выполняют какое-то странное регулярное выражение, которое я не могу полностью понять. Мне кажется, что это регулярное выражение будет соответствовать цельной строке, так почему они присоединяются к ней?
Затем они меняют строку и соединяются пустым массивом (это то же самое, что и обычная реверсивная строка или что?). После этого в блоке try я не могу понять, что происходит? Что делает Function
конструктор на самом деле здесь? В чем смысл ++1..a
? Мне просто интересно, как подойти к таким вопросам, как этот?
Подсказка: '({} + {}) [7]' - это один пробельный символ, потому что '{} + {}' создает * string * '" [object Object] [object Object] "'. – nnnnnn
Попробуйте выполнить функцию с помощью отладчика или добавьте 'console.log (a)' после каждой строки. Эта строка с '.match()' выглядит так, как будто она обновляет 'a', чтобы вставить пробел после шестого символа ввода. – nnnnnn
@ Bergi. Почему вы удалили тег ES6? Я не думаю, что '[... a]' будет компилироваться в более старых ecmascripts. –