0 в [1, 2] == true, почему?

Выдержка из моей консоли JavaScript:

> 0 in [1, 2]
true

Почему?

Ответы

Ответ 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.

Ответ 2

Поскольку в массиве есть 0 -ый элемент.

> 0 in [8,9]
true
> 1 in [8,9]
true
> 8 in [8,9]
false

Ответ 3

Вероятно, вы ищете [1,2].indexOf(0). indexOf может работать не в ie6.

Вот одна из реализаций, которая его исправляет:

if(!Array.indexOf) {
   Array.prototype.indexOf = function(obj) {
      for(var i=0; i<this.length; i++) {
         if (this[i]==obj) {
            return i;
         }
       }
       return -1;
    }
}