The two statements have a very different semantics.
The callbacks are the same, ie ids.includes(id) === true is equivalent to ~ids.indexOf(id) != 0. But arr.some() and !arr.every() have a different semantics:
some() returns true if at least one element fits the condidition
!every() returns true if at least one element doesn't fit the condition
So actually your first snippet is not checking, if there is at least one element in arr that is also contained in ids, but if there is at least one element in arr that is not contained in ids
So the correct version of first snippet would be
const invalid = !arr.every((id) => !(~ids.indexOf(id)));
Ie, checkig if not every element of arr is not contained in ids. From a computational standpoint, they are more or less the same:
indexOf and includes return on the first element element they find
some stops when the callback returns true for the first time
every stops when the callback returns false for the first time
- there is of course a (little) overhead for
~ and !
But if you compare this to your second snippet, it seems pretty obvious, that it is far more complex to read and understand and therefore far more complex to maintain.
const
arr = [1,2,3],
ids = [1,2,3,4,5,6]
const
i1 = !arr.every((id) => ~ids.indexOf(id)),
i2 = arr.some((id) => ids.includes(id)),
i3 = !arr.every((id) => !(~ids.indexOf(id)));
console.log(i1, i2, i3)
~in first statement?const invalid = !arr.every((id) => ~ids.indexOf(id);this is an invalid syntax. Missing). If that is added, it will show false as output which is not the expected one.~ids.indexOf(id)is an obscure way of doingids.indexOf(id) >= 0. Since~(-1)is0which is falsy. Whereas~N(whereNis a non-negative integer aka natural number) produces some negative integer which is truthy.~someNumberis a way of checking ifsomeNumber != -1and I personally find nothing obscure about it. Especially in the context ofindexOfbecause the "negative" (ie -1 = element is not found) result ofindexOfis actually a truthy, whereas one "positive" result (ie 0 = element is found at index 0) is a falsey, and the~converts-1to a falsey and0to a truthy. But for only checking if an element is contained, I'd preferincludes