HAS_SIDE_EFFECTS should compare by type-casting

http://jsfiddle.net/Eh29v/, try typing numbers to the left in the input field and the cursor will reset.

This is because `10 !== "10"` obviously isn't true. Simply using regular type-casting equality makes it behave correctly for integer/string properties (even if you give them objects/arrays).

I also added some comments explaining non-obvious details of related code.

Unable to provide test-case as `value` cannot be mocked on inputs.
defaultValue is probably always a string here, right?