var name = true; typeof name; // "string", not "boolean"
<script> var _value = "test value"; Object.defineProperty(window, "testName", { get: () => _value, set: (value) => { _value = String(value) }, }); </script> <script> var testName = {}; // prints [object Object] string console.log(testName, typeof testName); var name = {}; // prints [object Object] string console.log(name, typeof name); </script>
Other properties have the same behavior, for example `status`.
Note: there's also LegacyUnforgeable which has similar behavior: https://webidl.spec.whatwg.org/#LegacyUnforgeable
Even if you're not using modules, using an IIFE avoids all this by making your variables local instead of having them define/update properties on the global.
name = {first: "Jane", last: "Doe"}
I must have never used "name" as a name for a global variable or just for ones that were strings.