A touchstart or wheel listener can call preventDefault(), so the browser cannot begin scrolling until the handler has run. Every such listener therefore delays scrolling, whether or not it ever prevents anything.
// the browser must wait for this before it can scroll
el.addEventListener('touchstart', onTouch);
// a promise not to preventDefault — scrolling starts immediately
el.addEventListener('touchstart', onTouch, { passive: true });
Calling preventDefault() inside a passive listener does nothing and logs a warning, which is the correct trade: the handler still runs, just not on the critical path. Feature detection is awkward because the third argument used to be a boolean, so a browser that does not understand the options object reads {passive: true} as truthy and gets capture instead — the detection trick with a getter is worth copying rather than reinventing.