const found = [1, undefined, 2].find(x => !x)
// undefined

const not_found = [1, 2].find(x => !x)
// undefined

find はみつからないと undefined
みつかったのが undefined のときも undefined

見つかったか知りたい場合は配列にラップすればわかりやすい

const result1 = [1, undefined, 2].map(x => [x]).find(([x]) => !x)
// [undefined]

const result2 = [1, 2].map(x => [x]).find(([x]) => !x)
// undefined

map する手間と find で配列の中身を取り出す手間を省くために関数にすると

const find = (arr, cb) => {
const result = arr.map(x => [x]).find((x, i, a) => cb(x[0], i, a))
return {
found: !!result,
value: result && result[0]
}
}

find([1, undefined, 2], x => !x)
// {found: true, value: undefined}
find([1, 2], x => !x)
// {found: false, value: undefined}

作ったはいいけど よく考えたら findIndex でよかった
こっちのほうが index も取れるし 配列の要素のラップ版を作るコストもなし

const find2 = (arr, cb) => {
const index = arr.findIndex(cb)
return {
found: index >= 0,
value: arr[index],
index,
}
}

find2([1, undefined, 2], x => !x)
// {found: true, value: undefined, index: 1}

find2([1, 2], x => !x)
// {found: false, value: undefined, index: -1}