There's a list of keywords, special strings, which may not be used as an Identifier. The main reason is that the parser would otherwise not be able to make the distinction. All these keywords are currently in use.
There's also a list of future reserved words. These have been reserved for a long time and will remain that way to leave an option open to use them as part of the language. They consist of keywords found on other languages closely related to Javascript. This prevents them from being used in any Javascript source. If they wouldn't, using them as keywords later would impose serious backwards compatibility issues...
The keywords are: break, case, catch, continue, debugger, default, delete, do, else, finally, for, function, if, in, instanceof, new, return, switch, this, throw, try, typeof, var, void, while, with.
The future reserved words are: class, const, enum, export, extends, import, super.
The future reserved words while in strict mode are: implements, interface, let, package, private, protected, public, static, yield.
The latter is another inconsistency in the lexicon, related to regular expression literals. The CFG cannot possibly know which of the two versions of FutureReservedWord it should parse. It needs another parser to tell it what mode it is currently running in.
In my oppinion, they should have created a new production to harnas the new reserved words. However, in light of strict mode being a new introduced feature, any code that's built for strict mode will face more (possible) compatibility issues. It's also highly likely that such code is written with ES5 in mind, so there's little chance of these new words being used in such cases.