In 15.2.3.14 "Object.keys ( O )",
step 5 says:
For each own enumerable property of /O/ whose name String is /P/
The phrasing suggests that "whose name String is P" is a filter applied to each own enumerable property of O, and the substeps are only executed for those properties that satisfy the filter condition.
But in fact, the substeps are executed for *every* own enumerable property of O, and "whose name String is P" is actually meant to (on the fly) bind metavariable P to the name of the property.
To make this clearer, I suggest changing it to:
For each own enumerable property /prop/ of /O/
a. Let /P/ be the name of /prop/.
... [substeps as before]
corrected in editor's draft
in October 26, 2012 release draft