No, 'NaN' (a string) would become the key '$NaN', while NaN (the number) becomes the key 'NaN'.  This works exactly the same way that the number 0 and the string '0' are disambiguated.  -0 is a special case only because as an object field it converts to the same string as +0 (that is, '0').

`Object.is('foo', String('foo')) === true` so that works fine.

`Object.is('foo', new String('foo')) === false` but `typeof new String('foo') === 'object'` so that works ok, too.

I'll add some more test cases, though.