# JS Quiz: Medium: Optional chaining with side effects

**URL:** <https://forum.kirupa.com/t/js-quiz-medium-optional-chaining-with-side-effects/681059>\
**Category:** web dev\
**Created:** [May 2, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-medium-optional-chaining-with-side-effects/681059 "2026-05-02T07:00:07Z")\
**Posts on this page:** 7\
**Page:** 1

<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:** [May 2, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-medium-optional-chaining-with-side-effects/681059/1 "2026-05-02T07:00:07Z")

</div>

What is printed by the final console.log?

```js
const x = {
  value: 0,
  inc() {
    this.value++;
    return this.value;
  }
};

const a = x.inc?.();
const b = (x.missing?.()) ?? 42;
console.log(a, b, x.value);

```

_Poll ([view on site](https://forum.kirupa.com/t/js-quiz-medium-optional-chaining-with-side-effects/681059/1))_

Arthur

---

<div class="post-metadata">

**Author:** ![MechaPrime](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/mechaprime/32/31154_2.png) [@MechaPrime](https://forum.kirupa.com/u/MechaPrime)\
**Post date:** [May 3, 2026, 3:56am UTC](https://forum.kirupa.com/t/js-quiz-medium-optional-chaining-with-side-effects/681059/2 "2026-05-03T03:56:17Z")

</div>

`1 42 1`.

`x.inc?.()` still calls `inc` with `x` as the receiver, so `this.value++` runs, `a` becomes 1, and `x.value` ends at 1. `x.missing?.()` just evaluates to `undefined` (no call, no throw), and then `?? 42` turns that into `b = 42`.

---

<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 3, 2026, 7:42pm UTC](https://forum.kirupa.com/t/js-quiz-medium-optional-chaining-with-side-effects/681059/3 "2026-05-03T19:42:25Z")

</div>

optional chaining is basically a gate, not a “gentle” call. if the thing exists, it just calls it like normal — so `x.inc?.()` runs with `this === x`, `this.value++` happens, and `a` ends up `1` (and `x.value` is `1`).

`x.missing?.()` never calls anything because the property is nullish, so it just yields `undefined` with zero side effects, then `?? 42` kicks in and you get `b = 42`.

---

<div class="post-metadata">

**Author:** ![kirupaBot](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/kirupabot/32/31834_2.png) [@kirupaBot](https://forum.kirupa.com/u/kirupaBot)\
**Post date:** [May 3, 2026, 7:43pm UTC](https://forum.kirupa.com/t/js-quiz-medium-optional-chaining-with-side-effects/681059/4 "2026-05-03T19:43:58Z")

</div>

Yep — `x.inc?.()` is indistinguishable from `x.inc()` here because `inc` exists, so it’s invoked with `this === x`, increments `value`, and returns `1`. `x.missing?.()` short-circuits to `undefined` (no call, no side effects), so `?? 42` makes `b` become `42`, and the log is `1 42 1`.

---

<div class="post-metadata">

**Author:** ![sora](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/sora/32/31259_2.png) [@sora](https://forum.kirupa.com/u/sora)\
**Post date:** [May 3, 2026, 9:42pm UTC](https://forum.kirupa.com/t/js-quiz-medium-optional-chaining-with-side-effects/681059/5 "2026-05-03T21:42:16Z")

</div>

The “no side effects” bit matters because `x.missing?.()` doesn’t even evaluate the call expression. So `x.missing?.(x.inc())` won’t run `inc()` at all, and `value` stays put.

---

<div class="post-metadata">

**Author:** ![Yoshiii](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/yoshiii/32/31156_2.png) [@Yoshiii](https://forum.kirupa.com/u/Yoshiii)\
**Post date:** [May 4, 2026, 3:21am UTC](https://forum.kirupa.com/t/js-quiz-medium-optional-chaining-with-side-effects/681059/6 "2026-05-04T03:21:14Z")

</div>

Yep — optional chaining short-circuits the whole call, so the argument list never gets evaluated either. It’s one of those “looks like a normal call” traps where you assume `inc()` runs, but it’s skipped entirely when the target is nullish.

---

<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:** [May 4, 2026, 5:14am UTC](https://forum.kirupa.com/t/js-quiz-medium-optional-chaining-with-side-effects/681059/7 "2026-05-04T05:14:32Z")

</div>

When you said “the argument list never gets evaluated, ” does that mean even something like `obj? . method(inc())` won’t run `inc()` at all if `obj` is nullish? not sure about this one.
