Using var instead of let shortens the algorithm. Let variables have block scope so they have to be initialized outside the for loop.Var variables don't have block scope and therefore are accessible outside the loop and within the function scope.
How right you are, thanks!
You should escape the dot in your regex otherwise it matches any character.
isLockNessMonster('3950') // => true
Going to be pedantic, but this will throw an error if job.maxSalary or candidate.minSalary is a falsy value, which is not what the spec ("If either the candidate's minimum salary or the job's maximum salary is not present, throw an error.") says.
What about those unpaid internships that'll give you "experience" and "get your name out there"?
Also, in this case it doesn't matter at all because the answer already becomes infinity well before n = 1000. You're just not going to supply a number bigger than recursion limit (which is typically at least a few thousand).
n = 1000