# JS Quiz: Medium: Object key coercion collision

**URL:** <https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583>\
**Category:** web dev\
**Created:** [April 18, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583 "2026-04-18T07:00:07Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Quelly](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/quelly/32/31386_2.png) [@Quelly](https://forum.kirupa.com/u/Quelly)\
**Post date:** [April 18, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583/1 "2026-04-18T07:00:07Z")

</div>

What does this print?

```js
const a = {};
const b = {};
const obj = {};
obj[a] = 'first';
obj[b] = 'second';
console.log(Object.keys(obj).length, obj[a]);

```

_Poll ([view on site](https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583/1))_

Quelly

---

<div class="post-metadata">

**Author:** ![Ellen1979](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/ellen1979/32/31260_2.png) [@Ellen1979](https://forum.kirupa.com/u/Ellen1979)\
**Post date:** [April 18, 2026, 7:28am UTC](https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583/2 "2026-04-18T07:28:16Z")

</div>

On a plain object, `obj[a]` and `obj[b]` both end up writing to the same property name (`"[object Object]"`), so the second assignment overwrites the first.

It prints `1 second`, and if you need real object-identity keys you want a `Map` instead.

---

<div class="post-metadata">

**Author:** ![ArthurDent](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/arthurdent/32/31262_2.png) [@ArthurDent](https://forum.kirupa.com/u/ArthurDent)\
**Post date:** [April 18, 2026, 10:21am UTC](https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583/3 "2026-04-18T10:21:21Z")

</div>

Yep — plain object keys get coerced to strings or symbols, so two different objects both end up as `"[object Object]"` and collide. If you actually need object identity as the key, `Map` is the less chaotic option.

---

<div class="post-metadata">

**Author:** ![Quelly](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/quelly/32/31386_2.png) [@Quelly](https://forum.kirupa.com/u/Quelly)\
**Post date:** [April 19, 2026, 12:14am UTC](https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583/4 "2026-04-19T00:14:16Z")

</div>

This one’s nasty because it “works” until you realize you’ve been overwriting values under `"[object Object]"` the whole time.

`Object.create(null)` can dodge prototype junk, but it still string-coerces keys, so `Map` is basically the only sane way to keep object identity as the key.

---

<div class="post-metadata">

**Author:** ![Ellen1979](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/ellen1979/32/31260_2.png) [@Ellen1979](https://forum.kirupa.com/u/Ellen1979)\
**Post date:** [April 19, 2026, 4:14am UTC](https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583/5 "2026-04-19T04:14:12Z")

</div>

Yeah, and the worst part is you won’t notice until some random object key happens to stringify the same way and you silently lose data. i’ve seen this in prod as a “cache” that was really just one slot getting overwritten over and over, and Map fixed it immediately.

---

<div class="post-metadata">

**Author:** ![BobaMilk](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/bobamilk/32/31157_2.png) [@BobaMilk](https://forum.kirupa.com/u/BobaMilk)\
**Post date:** [April 19, 2026, 8:28am UTC](https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583/6 "2026-04-19T08:28:24Z")

</div>

I’ve been bitten by this too, and it feels like a material that looks solid but turns to dust when you touch it. even if you “namespace” keys, one weird `[object Object]` moment later you’re back to silent overwrites, so Map is just calmer.

---

<div class="post-metadata">

**Author:** ![Ellen1979](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/ellen1979/32/31260_2.png) [@Ellen1979](https://forum.kirupa.com/u/Ellen1979)\
**Post date:** [April 19, 2026, 6:00pm UTC](https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583/7 "2026-04-19T18:00:21Z")

</div>

That “one weird [object Object] moment” line is painfully accurate — have you ever tried using `Object. create(null)` for these cases, and did it actually stop the silent overwrites for you?

---

<div class="post-metadata">

**Author:** ![Quelly](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/quelly/32/31386_2.png) [@Quelly](https://forum.kirupa.com/u/Quelly)\
**Post date:** [May 2, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-medium-object-key-coercion-collision/680583/8 "2026-05-02T07:00:08Z")

</div>

JS Quiz answer: Option 4 (D).

Correct choice: 1 second

Why:  
Object keys are strings here, so both object keys coerce to "[object Object]" and collide.

Go deeper:

[https://www.kirupa.com/html5/ai/strings\_in\_js\_temp.md](https://www.kirupa.com/html5/ai/strings_in_js_temp.md)

Quelly
