Ответ 1
Потому что "in" возвращает true, если указанное свойство/индекс доступно в объекте. [1, 2] является массивом и имеет объект с индексом 0. Следовательно, 0 в [1, 2] и 1 в [1, 2]. Но! (2 в [1, 2]).
Изменить: для того, что вы, вероятно, намеревались, комментарий Дэвида Дорварда ниже очень полезен. Если вы (несколько извращенно) хотите придерживаться "in", вы можете использовать литерал объекта
x = {1: true, 2: true};
Это должно позволить 1 in x && 2 in x && !(0 in x)
и т.д. Но на самом деле просто используйте indexOf.